Làm thế nào Perl chuyển chuỗi số

Bất kỳ chuỗi trong ngôn ngữ lập trình Perl có thể được sử dụng như một con số. Đây là một ví dụ:

▶ Run
#!/usr/bin/perl

my $str = 'Hello';

print $str + 100;

Chương trình sẽ hiển thị các số 100. Chuỗi 'Hello' khi được sử dụng trong số học hoạt động là số 0. Số 0 cộng 100 sẽ 100 và đó là những gì chúng ta sẽ xem trên màn hình. Thường dùng từ "số bối" để tham khảo những gì là giá trị của các hoạt động được dùng như một con số.

Chuỗi 'Hello' trong một số hoàn cảnh đó 0. Nhưng không phải là tất cả chuỗi trong Perl là zero.

Nếu trong đầu của một dòng chữ số, thì số trở thành tổng của những con số này. Đây là một ví dụ:

▶ Run
#!/usr/bin/perl

my $str = '23ASDF';

print $str + 0;

Chương trình sẽ hiển thị các số 23.

Ở đây là một số ví dụ, chuỗi và số trong đó nó quay khi được sử dụng trong một số hoàn cảnh:

''          -> 0
'1.0ASDF'   -> 1
'1.2ADF'    -> 1.2
'0123ASDF'  -> 123
' 34ASDF'   -> 34
'0x13ABC'   -> 0
'0b10ABC'   -> 0
'1e+25ASDF' -> 1e+25
' +7ASDF'   -> 7
'-13ABC'    -> -13
'--13ABC'   -> 0
' 10 100'   -> 10

Đây là một kịch bản mà sẽ hiển thị các dữ liệu cùng:

▶ Run
#!/usr/bin/perl

use feature qw(say);

foreach my $str ('', '1.0ASDF', '1.2ADF', '0123ASDF', ' 34ASDF',  '0x13ABC', '0b10ABC', '1e+25ASDF', ' +7ASDF', '-13ABC', '--13ABC', ' 10 100') {
     say "'$str' -> " . ($str + 0);
}

use warnings;

Nếu Perl là use warnings; (mà hầu như luôn luôn có giá trị làm), sau đó dùng một chuỗi trong số bối cảnh sẽ in trên đầu lỗi tiêu chuẩn cảnh báo:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $str = 'Hello';

print $str + 100;

Đây là chương trình ra:

Argument "Hello" isn't numeric in addition (+) at script.pl line 8.
100

Đề nghị

Đó là một đề nghị không để sử dụng năng của ngôn ngữ. Nếu bạn cần để có được một số từ những chuỗi, làm điều đó một cách rõ ràng với sự giúp đỡ của biểu thức thông thường. Vì vậy, bạn chỉ có thể mô tả những dạng mà các bạn mong đợi để nhận được dữ liệu và sẽ có thể để nắm bắt tình hình khi các dữ liệu đến trong bộ dạng sai (thay vì im lặng nhận của zero).

Đây là một mẫu mã. Chúng tôi biết về các dữ liệu ở đầu dây là một số nguyên và chúng ta cần phải tính toán tổng của tất cả số ở tất cả các hàng.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my @strings = (
    '10 apples',
    '0 potatoes',
    '8 oranges',
    'nine lemons',
);

my $sum = 0;

foreach my $str (@strings) {
    if ($str =~ /^([0-9]+)/) {
        $sum += $1;
    } else {
        die "String '$str' is in incorrect format";
    }
}

print $sum;

Khi bạn chạy chương trình này, chúng tôi nhận được lỗi String 'nine lemons' is in incorrect format at script.pl line 19.. Cảm ơn chúng ta thấy rằng trong những dữ liệu đó là một vấn đề. Tùy thuộc về làm thế nào chúng tôi có thể sửa chữa các dữ liệu thay vì của một chuỗi 'nine lemons' sử dụng chuỗi '9 lemons', hoặc bạn rõ ràng có thể bỏ qua dòng này trong vòng một next if $str eq 'nine lemons'.

Nếu chúng ta đã sử dụng một cách tiêu chuẩn đó Perl chuyển chuỗi một số, những vòng lặp sẽ đơn giản hơn nhiều:

foreach my $str (@strings) {
    $sum += $str;
}

Nhưng trong trường hợp này, chúng tôi sẽ không biết dữ liệu đó không phù hợp với bộ dạng chúng ta mong đợi.

Các bài viết khác