Perl 中的数字到字符串的转换

Numeric to String conversion in Perl

据我所知什么时候像

这样的字符串
$a="120.43sunil"+5;    

它会给出类似

的结果
$a=125.43     

因为字符串不是数字,所以 "sunil" 部分将被省略。 如果我们得到像

这样的东西怎么办
$a="12fred34"*" 3"   

将字符串转换为 1234 还是 12034? 我是 perl 编程的新手。

如果您打开 strictwarnings - 就像您真正应该的那样 - 它会警告您。

这很好,因为这是个坏主意。

如果你尝试你的代码,你会看到你的第二个例子给出:

my $val="12fred34"*" 3"   ;
print $val;

给出:

Argument "12fred34" isn't numeric in multiplication (*)
36

perl 是 "finding" 12,并使用它,丢弃其余部分。

顺便说一句,你的第一个例子 - 也警告:

Argument "120.43sunil" isn't numeric in addition (+)

但实际上 - 这只是个坏主意。

perl 可以时将字符串隐式转换为数字,但如果不能则将发出警告。那是因为在你的第二种情况下,它是模棱两可的。文本应该为零吗?忽略?这是偶数还是两个?

如果你真的需要将字符串的一部分转换为数字,你应该先解析字符串,然后提取你想要的值。这可以像

一样简单
$val =~ s/\D//g; 

但它可能是:

@vals = $str =~ m/(\d+)/g; 

如果你真的想用数字和字符串做一些有趣的事情,看看 dualvar*:

#!/usr/bin/env perl
use strict;
use warnings;

use Scalar::Util qw ( dualvar ); 

my $val = dualvar ( 120.43, "sunil" );

print $val,"\n";
print $val + 0; #force numeric context;

虽然我们在使用它 - 不要使用 $a$b - 它们是在 perl - sorting 中具有特定用途的变量。无论如何,你不应该真正使用单字母变量,这是一个糟糕的编码习惯。

* 我实际上不建议乱用 dualvars - 它们真的很酷,但如果使用不当可能会产生一些非常糟糕的代码,这 可能 如果你是 "kind a new to perl programming"

就会发生

Perl 中字符串到数字的转换与 C 函数非常相似 strtod。也就是说,Perl 需要可选的前导空格、可选的符号(+-)、一些数字(可选地包含 .)和可选的指数(eE,可选符号(+-),更多数字)。

作为特殊情况,单词 NaNInf(不区分大小写)也被识别为数字。

如果字符串之后包含更多字符,它们将被忽略但会触发警告(如果启用了警告)。有一个例外:字符串 "0 but true" 在没有警告的情况下转换为 0

如果字符串不是以有效数字开头,它 returns 0(并发出警告)。