“什么是”呢;使用单位化价值$。范围内(或翻转)“;试着用Perl告诉我

“什么是”呢;使用单位化价值$。范围内(或翻转)“;试着用Perl告诉我,perl,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行 有人能帮我破译错误

我有以下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个元素(如果有),如果每个arg包含+、-、或*,则用()包围各个arg

我不认为错误源于args中的值,我认为我在某种程度上扭曲了范围…但当args有>1个元素时,我失败了。例如:

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

它的长短是-您的foreach行已断开:

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

如果您
使用诊断
您会得到:

在以下位置使用范围(或翻转)中的未初始化值$ (W未初始化)使用未定义的值,就好像它已经被初始化一样 已定义。它被解释为“”或0,但可能是个错误。 若要抑制此警告,请为变量指定一个定义的值

为了帮助您找出什么是未定义的,perl将尝试告诉您 未定义的变量(如果有)的名称。在某些情况下 它不能做到这一点,因此它还会告诉您使用了什么操作 但是,请注意,perl优化了您的程序 警告中显示的操作不一定会出现 在你的程序中,例如,“that$foo”通常是 优化为“that”。$foo,警告将引用 连接(.)运算符,即使中没有 你的节目

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

my $x = 1..3;
这实际上就是你在这里所做的-你试图把一个数组值赋给一个标量

这个问题有一个更详细的问题:

但基本上是:它将其视为一个范围操作符,就好像你在一个文件中工作一样。你可以通过这个操作符“操作”文件中的特定行

e、 g:

结果也一样

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

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";
使用严格;
使用警告;
my@args=('','');
打印“在@args之前\n”;
@args的s/(.[-+*].*)/\($1\)/;
打印“之后:@args\n”;

($args[1..$argsize-1])
=>
(@args)
或可能的
(@args[1..$#args])
参数在替换部分中不是元字符,所以不需要转义它们
/($1)/
使用诊断;
将为您提供非常详细的错误消息解释。您能给出一个
@args
的示例吗?啊,perl,使用您真是一次冒险……但感谢您的建议,完全解决了我的潜在问题,因此我投票支持您并接受了答案。我仍然想了解错误ter,但是que cera cera。我更喜欢新代码——我忍不住要写c风格的perl代码。我有点挖苦——
my$x=1..3;
做同样的事情,我想也是出于同样的原因。特别是,你试图将一个值序列压缩成一个值序列。我发现理解这个符号最有用变量的开头不是“它包含什么”,而是“我得到了什么”。因此,无论它是数组还是散列元素,您总是以
$
的形式访问单个值。太棒了。非常感谢。我必须说,多亏了这么多人和像您这样的人,我有效使用perl的能力大大提高了。啊,明白了。看看:(示例编辑为答案)
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";