我在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>
答案 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";