如何Perl转换串数字

任何string in Perl编程语言可以作为一个数字。 这里有一个例子:

▶ Run
#!/usr/bin/perl

my $str = 'Hello';

print $str + 100;

该程序将显示的数 100. 串 'Hello' 时使用在算术运算数 0. 数 0 再加上 100100 ,是我们将在屏幕上看到。 经常使用的词语"数值上下文中"提到 有什么价值的作用作一个数字。

'Hello' 数字下文它 0. 但并不是所有的字符串中Perl是零。

如果在一开始的一线的数字,那些成为总和,这些数字。 这里有一个例子:

▶ Run
#!/usr/bin/perl

my $str = '23ASDF';

print $str + 0;

该程序将显示的数 23.

这里有几个例子,这串数在其中事实证明,当使用数字方面:

''          -> 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

这里有一个脚本,这将显示同样的数据:

▶ 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;

如果Perl脚本是 use warnings; (这几乎总是值得做的),那么使用一串数字的上下文 将印STDERR警告:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $str = 'Hello';

print $str + 100;

这里是计划产出:

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

建议

有一项建议不使用这种特征的语言。 如果你需要得到一个数字符串,这样做明确 借助经常表达方式。 所以你可以描述的格式,其中你指望得到数据,将能够 抓住的情况下当数据达格式(而不是沉默收到的零)。

这里是一样的代码。 我们知道数据在开始串是一个整数和我们需要计算的总和所有 数字在所有行。

▶ 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;

当你执行这个程序,我们得到的错误 String 'nine lemons' is in incorrect format at script.pl line 19.. 感谢 我们看到,在数据有问题。 这取决于我们如何可以正确的数据,而不是一串 'nine lemons' 使用的字符串 '9 lemons',或者你可以明确地忽略了这条线在一个循环 next if $str eq 'nine lemons'.

如果我们使用了标准的方式,Perl转换串数字,循环将简单得多:

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

但在这种情况下,我们不会知道这些数据不匹配的格式,我们期望。

其他文章