我在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的字符串。该代码应循环通过第二个到第n个元素(如果存在),并且如果单个args包含+,-或*,则将它们用()包围。
我不认为错误源于args中的值,我认为我以某种方式搞定了范围...但是当args具有> 1个元素时,我却失败了。一个例子可能是:
<"bla bla bla"> <x-1> <foo>
它的长短是-您的foreach行已断开:
foreach my $a (@args[1..$argsize-1]) {
工作正常。这是因为您使用的$
是表示“标量值”的而不是@
表示数组(或列表)的。
如果use diagnostics
得到的话;
使用未初始化的值$。在(W未初始化)的范围内(或翻转)。使用未定义的值,就好像它已被定义一样。它被解释为“”或0,但也许是错误的。为消除此警告,请为变量分配一个已定义的值。
为了帮助您弄清未定义的内容,perl会尝试告诉您未定义的变量的名称(如果有)。在某些情况下,它不能执行此操作,因此它还告诉您使用了未定义值的操作。但是,请注意,perl会优化您的程序,警告中显示的操作不一定一定会在您的程序中出现。例如,通常将“ that $ foo”优化为“ that”。$ foo,并且警告将引用级联(。)运算符,即使没有。在您的程序中。
您可以通过以下方式重现此错误:
my $x = 1..3;
实际上,这实际上是您在此处所做的事情-您正在尝试将数组值分配给标量。
这个问题有更多的细节:
但基本上:将其视为范围运算符,就好像您正在处理文件一样。您将可以通过此运算符对文件中的特定行进行“操作”。
例如:
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开始而不是从0开始。
您可以改为:
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";
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句