2008-11-14 43 views
74

Làm cách nào để chuyển đổi một chuỗi giữ một số thành giá trị số của nó trong Perl?Làm cách nào để chuyển đổi chuỗi thành một số trong Perl?

+3

Một số câu trả lời khó hiểu vì câu hỏi đã được chỉnh sửa. Câu trả lời của porquero là tốt nhất cho phiên bản này của câu hỏi. – TimK

+0

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

Trả lời

83

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

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

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

+13

@OrangeDog OP đã chỉnh sửa câu hỏi (một 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 chấm động trong đó. – Alnitak

+1

Điều gì về so sánh khi chuỗi có dấu phẩy trong đó? – Ramy

3

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

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


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

Perl có nhiều loại hơn, nhưng đối với các giá trị đơn, nó chỉ là giá trị duy nhất. –

+2

bạn cũng có thể thêm 0 –

40

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

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

Nếu bạn làm chuỗi các loại của sự vật, bạn sẽ có được chuỗi:

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

Perl chủ yếu là hiểu ra phải làm gì và nó chủ yếu là đúng. Một cách khác để nói cùng một điều là Perl quan tâm nhiều hơn về độ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?

+0

Tha thứ cho sự thiếu hiểu biết của tôi ở đây nhưng tôi không hoàn toàn nhận đượ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ố. 'X' là toán tử nhân bản chuỗi. –

+1

Tôi hiểu rồi. cảm ơn! :) Perl chắc chắn có rất nhiều nhà khai thác. – gideon

9

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

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

6

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

54

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

Ví dụ 1

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

quả

123 

Ví dụ 2

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

quả

0 
+5

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

+0

@Cougar: Tôi đồng ý. –

+1

Cẩn thận khi thêm số không vào chuỗi. Nếu chuỗi bắt đầu bằng "inf" hoặc với "nan", giá trị sẽ không bằng 0. Ví dụ: my $ var2 = "info123"; in $ var2 + 0: Kết quả sẽ là: Inf –

1

So sánh nó tạo sự khác biệt nếu vô hướng là số chuỗi. Và nó không phải là luôn luôn decidable.Tôi có thể báo cáo một trường hợp perl lấy ra một phao trong ký hiệu "khoa học" và sử dụng cùng một vài dòng dưới đây 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 $val khô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 tốt ole C) đã giúp.

6
$var += 0 

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

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

bản ghi

var = abc123 
Argument "abc123" isn't numeric in addition (+) at test.pl line 7. 
var = 0 
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, và sau đó 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 đối xử với họ nội bộ như chuỗi.
Đọc: $my_hash{$1} = $2 if /(.+)=(.+)\n/;.
Dump: '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/;.
Dump: 'foo' => 42

Sau $2+0 Perl thông báo rằng bạn đã điều trị $ 2 như một số, bởi 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 băm với Data::Dumper.

Các vấn đề liên quan