Perl 中的数字到字符串的转换
Numeric to String conversion in Perl
据我所知什么时候像
这样的字符串
$a="120.43sunil"+5;
它会给出类似
的结果
$a=125.43
因为字符串不是数字,所以 "sunil" 部分将被省略。
如果我们得到像
这样的东西怎么办
$a="12fred34"*" 3"
将字符串转换为 1234 还是 12034?
我是 perl 编程的新手。
如果您打开 strict
和 warnings
- 就像您真正应该的那样 - 它会警告您。
这很好,因为这是个坏主意。
如果你尝试你的代码,你会看到你的第二个例子给出:
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
- sort
ing 中具有特定用途的变量。无论如何,你不应该真正使用单字母变量,这是一个糟糕的编码习惯。
* 我实际上不建议乱用 dualvars
- 它们真的很酷,但如果使用不当可能会产生一些非常糟糕的代码,这 可能 如果你是 "kind a new to perl programming"
就会发生
Perl 中字符串到数字的转换与 C 函数非常相似 strtod
。也就是说,Perl 需要可选的前导空格、可选的符号(+
或 -
)、一些数字(可选地包含 .
)和可选的指数(e
或 E
,可选符号(+
或 -
),更多数字)。
作为特殊情况,单词 NaN
和 Inf
(不区分大小写)也被识别为数字。
如果字符串之后包含更多字符,它们将被忽略但会触发警告(如果启用了警告)。有一个例外:字符串 "0 but true"
在没有警告的情况下转换为 0
。
如果字符串不是以有效数字开头,它 returns 0
(并发出警告)。
据我所知什么时候像
这样的字符串$a="120.43sunil"+5;
它会给出类似
的结果$a=125.43
因为字符串不是数字,所以 "sunil" 部分将被省略。 如果我们得到像
这样的东西怎么办$a="12fred34"*" 3"
将字符串转换为 1234 还是 12034? 我是 perl 编程的新手。
如果您打开 strict
和 warnings
- 就像您真正应该的那样 - 它会警告您。
这很好,因为这是个坏主意。
如果你尝试你的代码,你会看到你的第二个例子给出:
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
- sort
ing 中具有特定用途的变量。无论如何,你不应该真正使用单字母变量,这是一个糟糕的编码习惯。
* 我实际上不建议乱用 dualvars
- 它们真的很酷,但如果使用不当可能会产生一些非常糟糕的代码,这 可能 如果你是 "kind a new to perl programming"
Perl 中字符串到数字的转换与 C 函数非常相似 strtod
。也就是说,Perl 需要可选的前导空格、可选的符号(+
或 -
)、一些数字(可选地包含 .
)和可选的指数(e
或 E
,可选符号(+
或 -
),更多数字)。
作为特殊情况,单词 NaN
和 Inf
(不区分大小写)也被识别为数字。
如果字符串之后包含更多字符,它们将被忽略但会触发警告(如果启用了警告)。有一个例外:字符串 "0 but true"
在没有警告的情况下转换为 0
。
如果字符串不是以有效数字开头,它 returns 0
(并发出警告)。