Perl中的数字到字符串转换

时间:2015-10-16 11:28:48

标签: string perl numeric data-conversion

根据我的知识,什么时候像

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

它会给出像

这样的结果
$a=125.43     

由于字符串不是数字,因此将省略“sunil”部分。 如果我们得到像

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

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

2 个答案:

答案 0 :(得分: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中具有特定用途。你不应该真的使用单字母变量,这是一个糟糕的编码习惯。

*我实际上不推荐使用dualvars搞砸 - 它们真的很酷,但是如果使用得不好可以制作一些非常糟糕的代码,这就是可能发生的事情如果你是“对perl编程的新手”

答案 1 :(得分:0)

Perl中的字符串到数字转换与C函数strtod非常相似。也就是说,Perl期望可选的前导空格,可选符号(+-),一些数字(可选地包含.)和可选指数(e或{ {1}},可选符号(E+),更多数字)。

在特殊情况下,单词-NaN(不区分大小写)也会被识别为数字。

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

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