Perl for循环的语法

Perl for循环的语法,perl,Perl,我继承了一个Perl脚本,但还没有Perl背景。脚本失败: syntax error at /home/assay/assay/bin/mpprimer/MPprimer/bin/MPprimer_dimer_check.pl line 181, near "$k qw(a g c t)" 这是相关代码 # create a binding array for each of the four bases for $l (0 .. $pfl-1) { my $mbase = subst

我继承了一个Perl脚本,但还没有Perl背景。脚本失败:

syntax error at /home/assay/assay/bin/mpprimer/MPprimer/bin/MPprimer_dimer_check.pl line 181, near "$k qw(a g c t)"
这是相关代码

# create a binding array for each of the four bases
for $l (0 .. $pfl-1) {
    my $mbase = substr($fprimer_r, $l, 1);
    $primer_hash{$mbase}[$l]=1;
    for $k qw(a g c t) {
        $primer_hash{$k}[$l] ||=0;
    }
}

任何提示或建议都将不胜感激。

您需要在正在迭代的列表周围加上括号(本例中为
qw/
结构):


您可能已将Perl更新为5.18。在那个版本中,它的行为不像是括号。发件人:

qw(…)不能再用作括号
qw
用于愚弄用户的列表 解析器认为它们总是被括号包围着。这 允许一些令人惊讶的构造,例如
foreach$xqw(abc)
{…}
,应该为每个$x(qw(abc)){…}编写。 这些有时会使lexer进入错误的状态,因此 没有完全工作,类似的
foreach qw(abc){…}
可能会被允许根本不工作

这种副作用 qw现已被废除。自PerlV5.13.11以来,它一直被弃用。 现在有必要在所有需要的地方使用实括号 语法需要它们

因此,Perl 5.13.11之后出现了一个警告。如果您没有看到,可能是因为您从5.14.0*之前的版本升级,或者因为您从未查看错误日志

警告如下(使用grep/ctrl+f)


*)Perl 5中的次要版本指的是开发人员版本,甚至是官方稳定版本

谢谢,你是救命恩人!另外:永远不要使用
$l
-它看起来太像
$1
,这是内置的。实际上-尽量避免使用单字母变量。或者因为它们直接从5.13.11之前的版本中跳过。@jwodder那么它们就有了一个勇敢的系统管理员。:)更新
for $k (qw(a g c t)) {
Use of qw(...) as parentheses is deprecated