根据我的知识,什么时候像
这样的字符串$a="120.43sunil"+5;
它会给出像
这样的结果$a=125.43
由于字符串不是数字,因此将省略“sunil”部分。 如果我们得到像
这样的东西怎么办?$a="12fred34"*" 3"
将字符串转换为1234或12034? 我是perl编程的新手。
答案 0 :(得分:9)
如果你打开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
- sort
中具有特定用途。你不应该真的使用单字母变量,这是一个糟糕的编码习惯。
*我实际上不推荐使用dualvars
搞砸 - 它们真的很酷,但是如果使用得不好可以制作一些非常糟糕的代码,这就是可能发生的事情如果你是“对perl编程的新手”
答案 1 :(得分:0)
Perl中的字符串到数字转换与C函数strtod
非常相似。也就是说,Perl期望可选的前导空格,可选符号(+
或-
),一些数字(可选地包含.
)和可选指数(e
或{ {1}},可选符号(E
或+
),更多数字)。
在特殊情况下,单词-
和NaN
(不区分大小写)也会被识别为数字。
如果字符串后面包含更多字符,则会忽略它们但会触发警告(如果启用了警告)。有一个例外:字符串Inf
会在没有警告的情况下转换为"0 but true"
。
如果字符串没有以有效数字开头,则返回0
(并且还会发出警告)。