perl - 系统命令参数给出错误

时间:2015-02-05 20:46:57

标签: perl shell command system

很难找到解决方案。但我可能需要一些帮助。我试图在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.

2 个答案:

答案 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");