Làm cách nào để chuyển đổi một chuỗi thành một số trong Perl?


86

Tôi có một chuỗi chứa giá trị thập phân trong đó và tôi cần chuyển chuỗi đó thành một biến dấu phẩy động. Vì vậy, một ví dụ về chuỗi tôi có là "5.45" và tôi muốn có một dấu phẩy động tương đương để tôi có thể thêm .1 vào nó. Tôi đã tìm kiếm trên internet, nhưng tôi chỉ thấy cách chuyển đổi một chuỗi thành số nguyên.


Câu hỏi cần thêm chi tiết. Chuỗi chỉ bao gồm các chữ số? Chữ và số? Ok nếu alphas bị loại bỏ? Có mục đích cụ thể cho số kết quả không?
JGurtz

Câu trả lời:


90

Bạn không cần phải chuyển đổi nó:

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

25
5.55 không phải là số nguyên
OrangeDog

15
@OrangeDog OP đã chỉnh sửa câu hỏi (vài tháng sau khi câu trả lời này được đăng) - câu hỏi ban đầu thực sự có số dấu phẩy động trong đó.
Alnitak

1
Còn so sánh khi chuỗi có dấu phẩy thì sao?
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

Đây là một giải pháp đơn giản:

ví dụ 1

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

Kết quả

123

Ví dụ 2

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

Kết quả

0

7
AFAIU đây là câu trả lời duy nhất cho những gì được hỏi
Cougar

4
Hãy cẩn thận khi thêm số 0 vào một chuỗi. Nếu chuỗi bắt đầu bằng "inf" hoặc bằng "nan", giá trị sẽ không bằng 0. Ví dụ: $ var2 = "info123" của tôi; print $ var2 + 0: Kết quả sẽ là: Inf
Rodrigo De Almeida Siqueira

Tôi đang làm một foreach my $i ('00'..'15')và cần phải xóa các số 0 ở đầu ở một số nơi. Việc 0+đúc thành một con số này cũng đạt được điều đó.
stevesliva

Rõ ràng điều này không hoạt động với chuỗi hex: '0x14C' + 0 kết quả bằng 0 (arrggg)
Allasso

41

Perl là một ngôn ngữ dựa trên ngữ cảnh. Nó không thực hiện công việc của nó theo dữ liệu bạn cung cấp cho nó. Thay vào đó, nó tìm ra cách xử lý dữ liệu dựa trên các toán tử bạn sử dụng và bối cảnh mà bạn sử dụng chúng. Nếu bạn thực hiện các loại số, bạn sẽ nhận được các con số:

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

Nếu bạn thực hiện các loại chuỗi, bạn sẽ nhận được chuỗi:

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

Perl chủ yếu tìm ra những gì cần làm và nó gần như đúng. Một cách khác để nói điều tương tự là Perl quan tâm đến động từ hơn là danh từ.

Bạn đang cố gắng làm điều gì đó và nó không hoạt động?


Thứ lỗi cho sự thiếu hiểu biết của tôi ở đây nhưng tôi không hiểu được ví dụ thứ hai của bạn. Bạn đang chia hai số, sau đó nhân chúng, làm thế nào / tại sao điều này dẫn đến một chuỗi?
gideon

4
Tôi không nhân số. Là xtoán tử sao chép chuỗi.
brian d foy

3
Nó không phải là my $string = ( 45/2 ) x 3; # "22.522.522.5"với 45 thay vì 44? Nếu không, tôi không hiểu '.5 đến từ đâu trong kết quả ...
Vickster 27/02

10

Google dẫn tôi đến đây trong khi tìm kiếm cùng một câu hỏi mà phill đã hỏi (phân loại phao) vì vậy tôi nghĩ rằng sẽ đáng để đăng câu trả lời mặc dù chủ đề đã cũ. Tôi mới làm quen với perl và vẫn còn đang quấn lấy nó nhưng tuyên bố của brian d foy "Perl quan tâm đến động từ hơn là danh từ." trên thực sự đánh đinh vào đầu. Bạn không cần phải chuyển đổi chuỗi thành float trước khi áp dụng sắp xếp. Bạn cần cho biết sắp xếp để sắp xếp các giá trị dưới dạng số chứ không phải chuỗi. I E

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

Xem http://perldoc.perl.org/functions/sort.html để biết thêm chi tiết về loại


8

Theo tôi hiểu, int () không được dùng như một hàm 'ép kiểu' để chỉ định kiểu dữ liệu, nó chỉ đơn giản là (ab) được sử dụng ở đây để xác định ngữ cảnh dưới dạng một số học. Tôi (ab) đã sử dụng (0 + $ val) trong quá khứ để đảm bảo rằng $ val được coi là một số.


yes, int()is being "(ab) used"; hiểu rồi.
Sapphire_Brick

6
$var += 0

có thể là những gì bạn muốn. Tuy nhiên, được cảnh báo, nếu chuỗi $ var là không thể chuyển đổi thành số, bạn sẽ gặp lỗi và $ var sẽ được đặt lại thành 0 :

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

nhật ký

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

3

Perl thực sự chỉ có ba loại: vô hướng, mảng và băm. Và ngay cả sự phân biệt đó cũng có thể tranh cãi. ;) Cách mỗi biến được xử lý tùy thuộc vào những gì bạn làm với nó:

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


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

5
Perl có nhiều kiểu hơn, nhưng đối với các giá trị đơn lẻ, nó chỉ là một giá trị duy nhất.
brian d foy

1

Trong các phép so sánh, nó tạo ra sự khác biệt nếu một đại lượng vô hướng là một số của một chuỗi. Và nó không phải lúc nào cũng có thể quyết định được. Tôi có thể báo cáo một trường hợp trong đó perl truy xuất một float trong ký hiệu "khoa học" và sử dụng cùng một vài dòng bên dưới trong một so sánh:

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

Và ở đây $valkhông được hiểu là số cho ví dụ "2e-77"được truy xuất từ $line. Thêm 0 (hoặc 0.0 cho các lập trình viên ole C giỏi) đã giúp ích.


0

Perl được đánh máy yếu và dựa trên ngữ cảnh. Nhiều vô hướng có thể được coi là chuỗi và số, tùy thuộc vào toán tử bạn sử dụng. $a = 7*6; $b = 7x6; print "$a $b\n";
Bạn nhận được 42 777777.

Tuy nhiên, có một sự khác biệt nhỏ. Khi bạn đọc dữ liệu số từ một tệp văn bản vào một cấu trúc dữ liệu, rồi xem nó với Data::Dumper, bạn sẽ nhận thấy rằng các số của bạn được trích dẫn. Perl xử lý chúng bên trong như một chuỗi.
Đọc: $my_hash{$1} = $2 if /(.+)=(.+)\n/;.
Bán phá giá:'foo' => '42'

Nếu bạn muốn con số không thể viện chứng trong bãi:
đọc: $my_hash{$1} = $2+0 if /(.+)=(.+)\n/;.
Bán phá giá:'foo' => 42

Sau khi $2+0Perl nhận thấy rằng bạn đã coi $ 2 là một số, vì bạn đã sử dụng một toán tử số.

Tôi nhận thấy điều này trong khi cố gắng so sánh hai hàm băm với Data::Dumper.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.