我继承了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;
}
}
任何指示或建议都将不胜感激。
答案 0 :(得分:8)
您可能已将Perl更新为5.18。在该版本中,qw operator was changed的行为与括号不同。来自perl5180delta:
qw(...)不能再用作括号
qw
列表用于欺骗 解析器认为它们总是被括号括起来。这个 允许一些令人惊讶的结构,例如foreach $x qw(a b c) {...}
,这应该真正写成foreach $x (qw(a b c)) {...}
。 这些有时会使词法分析器进入错误的状态,所以他们 没有完全发挥作用,和那个类似的foreach qw(a b c) {...}
可能会被允许从来没有工作过。这种副作用 qw现在已被废除。自Perl v5.13.11以来,它已被弃用。 现在有必要在任何地方使用真正的括号 语法要求他们。
自从Perl 5.13.11以来就出现了警告。如果您没有看到它,可能是您从早于5.14.0 * 的版本升级了,或者因为您从未查看过错误日志。
警告可能是以下内容,可在perldiag中找到(使用grep / ctrl + f)。
Use of qw(...) as parentheses is deprecated
*)Perl 5中不均匀的次要版本是指开发者版本,甚至是官方稳定版本的版本
答案 1 :(得分:4)
您需要在迭代的列表周围放置括号(在这种情况下为qw//
构造):
for $k (qw(a g c t)) {