如果你打开 strict 和 warnings - 你真的应该这样做 - 它会警告你。
这很好,因为这是个坏主意。
如果你尝试你的代码,你会看到你的第二个例子:
my $val="12fred34"*" 3" ;
print $val;
给予:
Argument "12fred34" isn't numeric in multiplication (*)
36
perl 正在“找到” 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 - 它们真的很酷,但如果使用不当可能会产生一些非常糟糕的代码,如果你可能会发生这种情况're "对 perl 编程很陌生"