什么是“在范围(或翻转)中使用单位价值$。试图在Perl中告诉我

时间:2015-07-03 11:05:03

标签: perl

我在Perl中有以下代码片段:

my $argsize = @args;
if ($argsize >1){
    foreach my $a ($args[1..$argsize-1]) {
    $a =~ s/(.*[-+*].*)/\($1\)/; # if there's a math operator, put in parens
    }
}

执行时我得到“在范围(或翻转)中使用单位化值$。后跟参数”“在数组元素中不是数字......都指向foreach行。

有人可以帮我解密错误信息(并解决问题)吗?我有一个数组@args的字符串。代码应循环遍历第二个不是元素(如果存在),并且如果它们包含+, - 或*,则用()包围各个args。

我不认为这个错误源于args中的值,我想我是以某种方式搞砸了范围......但是当args有>我失败了1个元素。一个例子可能是:

<"bla bla bla">  <x-1>  <foo> 

1 个答案:

答案 0 :(得分:5)

它的长短是 - 你的foreach行打破了:

foreach my $a (@args[1..$argsize-1]) {

工作正常。这是因为您使用的$表示“标量值”&#39;而不是表示数组(或列表)的@

如果你得到use diagnostics;

  

使用未初始化的值$。在范围内(或翻转)在      (W未初始化)使用未定义的值,就好像它已经存在一样       定义。它被解释为&#34;&#34;或者是0,但也许这是一个错误。       要禁止此警告,请为变量分配定义的值。

     

为了帮助您弄清楚未定义的内容,perl将尝试告诉您       未定义的变量(如果有)的名称。在某些情况下       它不能这样做,所以它也告诉你你使用了什么操作       未定义的值。但请注意,perl会优化您的程序       并且不一定会出现警告中显示的操作       字面上在你的程序中。例如,&#34;那个$ foo&#34;通常是       优化成&#34;那&#34; 。 $ foo,警告将参考       连接(。)运算符,即使没有。在       你的计划。

您可以通过以下方式重现此错误:

my $x = 1..3;

这实际上就是你在这里所做的 - 你试图将数组值分配给标量。

在这个问题中有更多细节:

What is the Perl context with range operator?

但基本上:它将它视为范围运算符,就好像你正在通过文件一样工作。你可以在&#39;上采取行动。通过此运算符在文件中的特定行。

e.g:

use Data::Dumper;
while (<DATA>) {
    my $x = 2 .. 3;
    print Dumper $x;
    print if $x;
}

__DATA__
line one
another line
third line
fourth line

该范围运算符正在测试行号 - 并且因为您没有行号(因为您没有迭代文件),所以它会出错。 (但除此之外 - 它可能有效,但你得到一些真的奇怪的结果;))

但是我建议你做这个非常复杂的方式,并且(可能会?)一个错误,因为你在1开始数组,而不是零。

你可以改为:

s/(.*[-+*].*)/\($1\)/ for @args; 

哪个会有相同的结果。

(如果您需要跳过第一个参数:

my ( $first_arg, @rest ) = @args; 
s/(.*[-+*].*)/\($1\)/ for @rest;

但是这个错误在运行时是由你输入的一些数据造成的。虽然你在这里得到了什么:

use strict;
use warnings;

my @args =  ( '<"bla bla bla">',  '<x-1>',  '<foo>' );

print "Before @args\n";
s/(.*[-+*].*)/\($1\)/ for @args;
print "After: @args\n";