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