Bagaimana cara mengubah string menjadi angka di Perl?

86

Saya memiliki string yang memegang nilai desimal di dalamnya dan saya perlu mengubah string itu menjadi variabel floating point. Jadi contoh string yang saya miliki adalah "5.45" dan saya ingin floating point yang setara sehingga saya dapat menambahkan .1 ke dalamnya. Saya telah mencari di sekitar internet, tetapi saya hanya melihat bagaimana mengubah string menjadi integer.

Anton
sumber
Pertanyaan tersebut membutuhkan detail lebih lanjut. Apakah string hanya terdiri dari angka? Alfanumerik? Ok jika alpha dilucuti? Apakah ada tujuan khusus dari angka yang dihasilkan?
JGurtz

Jawaban:

91

Anda tidak perlu mengubahnya sama sekali:

% perl -e 'print "5.45" + 0.1;'
5.55
Alnitak
sumber
15
@OrangeDog OP mengedit pertanyaan (beberapa bulan setelah jawaban ini diposting) - pertanyaan asli sebenarnya memiliki angka floating point di dalamnya.
Alnitak
1
bagaimana dengan perbandingan jika string memiliki koma di dalamnya?
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
73

Ini adalah solusi sederhana:

Contoh 1

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

Hasil

123

Contoh 2

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

Hasil

0
porquero
sumber
7
AFAIU ini adalah satu-satunya jawaban untuk apa yang ditanyakan
Cougar
4
Hati-hati saat menambahkan nol ke string. Jika string dimulai dengan "inf" atau dengan "nan", nilainya tidak akan nol. Misalnya $ var2 saya = "info123"; cetak $ var2 + 0: Hasil akan menjadi: Inf
Rodrigo De Almeida Siqueira
Saya sedang melakukan foreach my $i ('00'..'15')dan perlu menghapus angka nol di depan di beberapa tempat. Ini 0+casting ke nomor juga mencapai itu.
stevesliva
Rupanya ini tidak berfungsi dengan string hex: '0x14C' + 0 hasil dalam 0 (arrggg)
Allasso
41

Perl adalah bahasa berbasis konteks. Itu tidak melakukan tugasnya sesuai dengan data yang Anda berikan. Alih-alih, ia mencari cara untuk memperlakukan data berdasarkan operator yang Anda gunakan dan konteks di mana Anda menggunakannya. Jika Anda melakukan berbagai hal tentang angka, Anda mendapatkan angka:

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

Jika Anda melakukan hal-hal seperti string, Anda mendapatkan string:

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

Perl kebanyakan memikirkan apa yang harus dilakukan dan itu sebagian besar benar. Cara lain untuk mengatakan hal yang sama adalah Perl lebih memperhatikan kata kerja daripada kata benda.

Apakah Anda mencoba melakukan sesuatu dan tidak berhasil?

brian d foy
sumber
Maafkan kurangnya pengetahuan saya di sini, tetapi saya tidak mengerti contoh kedua Anda. Anda membagi dua angka, lalu mengalikannya, bagaimana / mengapa ini menghasilkan string?
gideon
4
Saya tidak mengalikan angka. Ini xadalah operator replikasi string.
Brian d foy
3
Bukankah seharusnya my $string = ( 45/2 ) x 3; # "22.522.522.5"dengan 45 bukannya 44? Kalau tidak, saya tidak mengerti dari mana '.5 berasal dari hasil ...
Vickster
10

Google membawa saya ke sini saat mencari pertanyaan yang sama yang ditanyakan oleh phill (menyortir float) jadi saya pikir akan bermanfaat untuk memposting jawabannya meskipun utasnya agak lama. Saya baru mengenal perl dan masih memikirkannya, tetapi pernyataan brian d foy "Perl lebih peduli tentang verba daripada kata benda." di atas benar-benar menyentuh paku di kepala. Anda tidak perlu mengubah string menjadi float sebelum menerapkan sortir. Anda perlu memberi tahu pengurutan untuk mengurutkan nilai sebagai angka dan bukan string. yaitu

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

Lihat http://perldoc.perl.org/functions/sort.html untuk detail lebih lanjut tentang sort

Norma
sumber
8

Seperti yang saya pahami int () tidak dimaksudkan sebagai fungsi 'cast' untuk menunjuk tipe data, itu hanya digunakan (ab) di sini untuk mendefinisikan konteks sebagai satu aritmatika. Saya (ab) menggunakan (0 + $ val) di masa lalu untuk memastikan bahwa $ val diperlakukan sebagai angka.

mccutchm.dll
sumber
ya, int()sedang "(ab) digunakan"; oke.
Sapphire_Brick
6
$var += 0

mungkin apa yang Anda inginkan. Namun berhati-hatilah, jika $ var adalah string tidak dapat dikonversi ke numerik, Anda akan mendapatkan kesalahan, dan $ var akan disetel ulang ke 0 :

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

log

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

Perl benar-benar hanya memiliki tiga jenis: skalar, larik, dan hash. Dan bahkan perbedaan itu bisa diperdebatkan. ;) Cara setiap variabel diperlakukan bergantung pada apa yang Anda lakukan dengannya:

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


% perl -e "print '5.4' + '3.4';"
8.8
Rini
sumber
5
Perl memiliki lebih banyak tipe daripada, tetapi untuk nilai tunggal, itu hanya satu nilai.
Brian d foy
1

Dalam perbandingan, ada bedanya jika skalar adalah sejumlah string. Dan itu tidak selalu bisa diputuskan. Saya dapat melaporkan kasus di mana perl mengambil pelampung dalam notasi "ilmiah" dan menggunakan beberapa baris yang sama di bawah ini sebagai perbandingan:

use strict;
....
next unless $line =~ /and your result is:\s*(.*)/;
my $val = $1;
if ($val < 0.001) {
   print "this is small\n";
}

Dan di sini $valtidak diartikan sebagai numerik untuk misalnya "2e-77"diambil dari $line. Menambahkan 0 (atau 0,0 untuk programmer C ole yang baik) membantu.

Steffen Moeller
sumber
0

Perl diketik dengan lemah dan berdasarkan konteks. Banyak skalar dapat diperlakukan sebagai string dan angka, bergantung pada operator yang Anda gunakan. $a = 7*6; $b = 7x6; print "$a $b\n";
Anda mendapatkan 42 777777.

Namun, ada perbedaan halus. Saat Anda membaca data numerik dari file teks ke dalam struktur data, lalu menampilkannya dengan Data::Dumper, Anda akan melihat bahwa nomor Anda dikutip. Perl memperlakukan mereka secara internal sebagai string.
Baca: $my_hash{$1} = $2 if /(.+)=(.+)\n/;.
Membuang:'foo' => '42'

Jika Anda ingin nomor unquoted di dump:
Baca: $my_hash{$1} = $2+0 if /(.+)=(.+)\n/;.
Membuang:'foo' => 42

Setelah $2+0Perl memperhatikan bahwa Anda telah memperlakukan $ 2 sebagai angka, karena Anda menggunakan operator numerik.

Saya memperhatikan ini saat mencoba membandingkan dua hash dengan Data::Dumper.

SzG
sumber