【问题标题】:Numeric to String conversion in PerlPerl 中的数字到字符串的转换
【发布时间】:2015-10-16 11:28:48
【问题描述】:

据我所知,像

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

它会给出类似的结果

$a=125.43     

由于字符串不是数字,“sunil”部分将被省略。 如果我们得到类似的东西怎么办

$a="12fred34"*" 3"   

字符串会被转换为 1234 还是 12034 ? 我是 perl 编程的新手。

【问题讨论】:

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

标签: string perl numeric data-conversion


【解决方案1】:

如果你打开 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 - sorting 中具有特定用途的变量。无论如何,您不应该真正使用单字母变量,这是一个不好的编码习惯。

* 我实际上不建议使用 dualvars - 它们真的很酷,但如果使用不当可能会产生一些非常糟糕的代码,如果你可能会发生这种情况're "对 perl 编程很陌生"

【讨论】:

  • 我想总结一下!可惜你让dualvars 出笼了
  • 如果有人想要用新的方式来打自己的脚,那我该和谁争辩呢?
【解决方案2】:

Perl 中的字符串到数字的转换很像 C 函数 strtod。也就是说,Perl 需要可选的前导空格、可选的符号(+-)、一些数字(可选地包含 .)和可选的指数(eE,可选的符号(@ 987654327@ 或 -),还有一些数字)。

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

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

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

【讨论】:

  • '0 but true'也是特例
  • @Sobrique Contextual::Return 是一个糟糕的主意,并且(像所有 Damian 模块一样)不应该在玩具程序中使用,恕我直言。
  • 可能,但这是处理 0 但真实案例的一种方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 2016-01-12
相关资源
最近更新 更多