很难找到解决方案。但我可能需要一些帮助。我试图在perl中的系统命令中传递一堆参数。但是我得到了一个无关紧要的错误。我使用正确的范围正确声明了我的变量,但仍然会在下面得到此错误。这是我的代码。
#!/usr/bin/perl
use warnings;
use strict;
my $mi = 0;
my $mj = 0;
my @regbyte;
my @databyte;
my $filename;
my @args;
@regbyte = ("00","01","02","03","04","05","06","07","08","09","0A","0B","0C","0D","0E","0F","10","11","12");
@databyte = ("00","01","02","03","04","05","06","07","08","09", "0A", "0B");
for($mi=0; $mi<13; $mi++)
{
for($mj=0; $mj<256; $mj++)
{
$filename = "write_" . $regbyte[$mi] . "_" . $databyte[$mj] . ".atp";
system("perl perl_2_ver2.5.pl", $filename, $regbyte[$mi], $databyte[$mj], "n");
}
}
这是我收到的错误消息。
Global symbol "$databyte" requires explicit package name at perl_2_ver2.8.pl line 20.
Execution of perl_2_ver2.8.pl aborted due to compilation errors.
答案 0 :(得分:2)
我对一些事情感到困惑,尤其是"n"
电话中的system
。这应该是"\n"
吗?因为在那种情况下它是不必要的和错误的。
主要问题是你有
for ( $mj = 0; $mj < 256; $mj++ ) { .. }
然后在$databyte[$mj]
只有12个元素时访问@databyte
。很难知道你的意思。
这里是我如何写出有用的东西,但可能不是你的意图。
use strict;
use warnings 'FATAL';
for my $regbyte (0 .. 0x12) {
for my $databyte (0 .. 0x0B) {
my $filename = sprintf "write_%02X_%02X.atp", $regbyte, $databyte;
system("perl perl_2_ver2.5.pl $filename $regbyte $databyte");
}
}
看起来您希望运行脚本perl_2_ver2.5.pl
,其输入包含所有类似write_*_*.atp
的文件。是吗?
除非目录中包含您 想要处理的atp
个文件,否则最好只使用
while (my $filename = glob 'write*.atp') {
next unless /\Awrite_(\p{hex}{2})_(\p{hex}{2}).atp\z/;
system("perl perl_2_ver2.5.pl $filename $1 $2");
}
只处理做所有文件并匹配模式。
答案 1 :(得分:0)
我复制/粘贴了您的代码,只替换了system
调用的程序参数,但我没有收到您报告的错误。但是,访问的数组元素很多,不存在。
您可以使用如下的数组化来限制循环:
for($mi=0; $mi<$#regbyte; $mi++)
我相信你有两个系统调用的选择,perl_2_ver2.5.pl
是可执行的,然后你可以说(假设,同一目录):
system("./perl_2_ver2.5.pl", $filename, $regbyte[$mi], $databyte[$mj], "n");
或者您必须致电:
system("perl" , "./perl_2_ver2.5.pl", $filename, $regbyte[$mi], $databyte[$mj], "n");