Soru Perl'de bir dizgiyi sayıya nasıl dönüştürebilirim?


Perl'de sayısal bir sayıya bir sayı tutan bir dizgiyi nasıl dönüştürürüm?


76
2017-11-14 00:39


Menşei


Bazı cevaplar kafa karıştırıcıdır çünkü soru düzenlenmiştir. Porquero'nun cevabı, sorunun bu sürümü için en iyisidir. - TimK
Soru daha fazla detay gerektiriyor. Dize sadece rakamlardan mı oluşuyor? Alfanümerik? Tamam, alfa soyulduysa? Ortaya çıkan sayı için belirli bir amaç var mı? - JGurtz


Cevaplar:


Bunu hiç dönüştürmenize gerek yok:

% perl -e 'print "5.45" + 0.1;'
5.55

86
2017-11-14 00:43



5.55 tam sayı değil - OrangeDog
@OrangeDog OP soruyu düzenledi (bu cevap gönderildikten bir kaç ay sonra) - asıl soru aslında içinde kayan nokta numaraları vardı. - Alnitak
Dize içinde virgül olduğunda karşılaştırmalar ne olacak? - Ramy
[rabdelaz@Linux_Desktop:~/workspace/akatest_5]$perl -e 'print "nope\n" unless "1,000" > 10;' nope [rabdelaz@Linux_Desktop:~/workspace/akatest_5]$perl -e 'print "nope\n" if "1,000" > 10;' - Ramy


Bu basit bir çözüm:

örnek 1

my $var1 = "123abc";
print $var1 + 0;

Sonuç

123

Örnek 2

my $var2 = "abc123";
print $var2 + 0;

Sonuç

0

62
2017-12-16 19:18



AFAIU, bu sorulanın tek cevabı - Cougar
@Cougar: Katılıyorum. - Peter Mortensen
Dizeye sıfır eklerken dikkatli olun. Dize "inf" veya "nan" ile başlıyorsa, değer sıfır olmayacaktır. Örneğin. $ var2 = "info123"; $ var2 + 0 yazdır: Sonuç şöyle olur: Inf - Rodrigo De Almeida Siqueira
Ben yapıyordum foreach my $i ('00'..'15') ve bazı yerlerde önde gelen sıfırları kaldırmak için gerekli. Bu 0+bir sayıya dökmek de bunu başarır. - stevesliva


Perl, içerik tabanlı bir dildir. İşini verdiğiniz verilere göre yapmaz. Bunun yerine, kullandığınız işleçlere ve bunları kullandığınız bağlama bağlı olarak verilerin nasıl ele alınacağını belirler. Sayılar yaparsanız, sayı alırsınız:

# numeric addition with strings:
my $sum = '5.45' + '0.01'; # 5.46

Eğer bir çeşit şey yaparsan, ipler alırsın:

# string replication with numbers:
my $string = ( 45/2 ) x 4; # "22.522.522.522.5"

Perl çoğunlukla ne yapması gerektiğini anlıyor ve çoğunlukla doğru. Aynı şeyi söylemenin başka bir yolu da Perl'in fiillerden çok, isimlerden daha çok önemsediğidir.

Bir şeyler yapmaya çalışıyor musun ve çalışmıyor?


40
2017-11-14 03:06



Buradaki bilgi eksikliğimi bağışla ama ben senin ikinci örneğini almıyorum. İki sayıyı bölerek, sonra onları çoğaltırsınız, bu neden bir dizeyle sonuçlanır? - gideon
Sayıları çarpmıyorum. x dize çoğaltma işlecidir. - brian d foy
Ah anlıyorum. Teşekkürler! :) Perl'de çok fazla operatör var. - gideon
Olmamalı my $string = ( 45/2 ) x 3; # "22.522.522.5" 45 yerine 45 mi? Aksi halde, sonuçta '.5'lerin geldiği yere ulaşamıyorum ... - Vickster


Google aynı soruyı ararken sorguluyor (floatlar) diye sorduğumda, bu yüzden ben de biraz eski olmasına rağmen cevabını yayınlamaya değeceğini düşündüm. Perl için yeniyim ve hala kafamın etrafına sarılıyorum ama Brian Dean'in ifadesi "Perl, isimlerden çok fiiller hakkında daha çok umurunda." yukarıda gerçekten kafasına çivi vurur. Sıralamadan önce dizeleri floatlara dönüştürmenize gerek yoktur. Sıralamalara, değerleri dizge olarak değil, sayı olarak sıralamak için söylemeniz gerekir. diğer bir deyişle

my @foo = ('1.2', '3.4', '2.1', '4.6');
my @foo_sort = sort {$a <=> $b} @foo;

Görmek http://perldoc.perl.org/functions/sort.html sıralama hakkında daha fazla bilgi için


9
2018-05-14 16:27





Anladığım kadarıyla int () veri tipini tanımlamak için bir 'cast' fonksiyonu olarak tasarlanmamıştır, sadece bir aritmetik olarak bağlamı tanımlamak için burada (ab) 'dir. $ Val'in bir sayı olarak kabul edildiğinden emin olmak için geçmişte (0 + $ val) kullandım (ab).


6
2017-08-25 17:22





$var += 0

Muhtemelen ne istersen. Ancak uyar, $ var dizesi sayısal değere dönüştürülemezse, hatayı alırsınız ve $ var 0'a sıfırlanacak:

my $var = 'abc123';
print "var = $var\n";
$var += 0;
print "var = $var\n";

günlükleri

var = abc123
Argument "abc123" isn't numeric in addition (+) at test.pl line 7.
var = 0

6
2017-07-14 07:58





Perl gerçekten sadece üç türü vardır: skaler, dizi ve karma. Ve bu ayrım bile tartışmalıdır. ;) Her değişkenin işleme şekli, onunla ne yaptığınıza bağlı olarak değişir:

% perl -e "print 5.4 . 3.4;"
5.43.4


% perl -e "print '5.4' + '3.4';"
8.8

3
2017-11-14 01:25



Perl'den çok daha fazla türü var, ama tek değerler için, sadece tek bir değer. - brian d foy
0 da ekleyebilirsiniz - Nathan Fellman