2015-10-16 67 views
1

字符串转换据我了解当过像数字在Perl

$a="120.43sunil"+5;  

一个字符串,它会给像

$a=125.43  

一个结果,因为字符串不是一个数字的“苏尼尔”部分会被省略。 如果我们得到这样

$a="12fred34"*" 3" 

一些事情将字符串转换为1234或12034? 这是一个新的perl编程。

+4

你试过了吗? – Jens

+3

似乎很奇怪,你会问这是一个问题,而不是仅仅尝试一下。 –

回答

9

如果你打开strictwarnings - 就像你真的应该 - 它会警告你。

这是好的,因为这是一个坏主意。

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

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 ing中具有特定用途的变量。无论如何,你不应该使用单字母变量,这是一种糟糕的编码习惯。

*我不会真的建议与dualvars乱搞 - 他们真的很酷,但可以让使用是否严重一些非常可怕的代码,这会可能发生什么,如果你是“一种新的perl编程“

+1

我认为,总结起来!可惜你让'dualvars'走出它的笼子,尽管 – Borodin

+0

如果有人想要在脚下自我射击的新方法,那么我该争论谁呢? – Sobrique

0

Perl中的字符串到数字转换的工作方式非常类似于C函数strtod。也就是说,Perl期望可选的前导空格,可选符号(+-),某些数字(可选包含.)和可选指数(eE,可选符号(+-),更多数字)。

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

如果字符串中包含更多字符,它们将被忽略但会触发警告(如果警告已启用)。有一个例外:字符串"0 but true"转换为0而不发出警告。

如果字符串未以有效数字开头,则返回0(并且还会发出警告)。

+1

''0但是true''也是一个特殊情况 – ysth

+0

0但是,真正的情况是我可能会试图触发Contextual :: Return,它可以让你知道布尔和标量上下文之间的区别。 – Sobrique

+0

@Sobrique Contextual ::返回是一个可怕的想法,并且(像所有达米安模块一样)不应该被使用,除了在玩具程序恕我直言。 – melpomene