Perl中用于Evalue替换的正则表达式

时间:2014-03-28 11:11:00

标签: regex perl

我想要达到的目的是将Evalue 1e-2转换为0.01。

my $cutoff = "1e-12";

if ($cutoff =~ m/^\de-{1}\d+?$/){
      $cutoff = s/e-/*10^(-/;
      $cutoff .= ")";
}  

print "$cutoff\n";

这是一个更大的脚本的一部分,在use warnings;下运行它总是给我Use of uninitialized value $_ in substitution (s///) at test.pl line 4, <STDIN> line 1.

有没有人发现这里的错误?我似乎无法这样做。

2 个答案:

答案 0 :(得分:2)

您收到的警告是因为您在替换运算符前使用了=而不是=~。你需要:

$cutoff =~ s/e-/*10^(-/;

但这不是唯一的问题。您还必须eval声明才能获得您想要的内容,这不仅是一个糟糕的设计,而且完全没有必要。 Perl本身将"1e-12"之类的值视为数字,因此您根本不应该使用正则表达式执行此操作。您可以简单地格式化输出:

printf '%d',$val;

这会将1e-2转换为.01。如果您需要创建这样的非常长的数字,请查看相应的模块。

答案 1 :(得分:1)

您是否意识到“1e-2”已经是Perl中某个数字的有效格式?你只需要说服Perl将其视为一个数字。

$ perl -E'$x= "1e-2"; say $x'
1e-2
$ perl -E'$x= "1e-2"; $x+=0; say $x'
0.01

为它添加零可确保Perl知道它是一个数字。