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.


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

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

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?


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


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.


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

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

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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.