【问题标题】:perl - system command arguments give errorperl - 系统命令参数给出错误
【发布时间】:2015-04-05 21:10:12
【问题描述】:

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

【问题讨论】:

  • 我在尝试验证您的代码时没有遇到同样的错误。你确定它是逐字复制的吗?另外 - 我认为你有一个逻辑错误。您迭代了 @databyte 的 256 个元素,但它没有那么多元素。 (无论如何,foreach 循环可能更适合您正在做的事情)
  • 您向我们展示的脚本是perl_2_ver2.8.pl 脚本吗?如果没有,您就没有显示相关的 Perl 代码。如果是,为什么要通过再次执行脚本来“递归”?您可以消除@args 并且可以(应该)在您定义它们的行中初始化@regbyte@databyte。所有$mi$mj$filename 的范围都可以比你的范围小得多。
  • 您显示的错误消息与 Perl 源代码不对应。第 20 行是您的 system 调用,但您没有访问名为 $databyte 的变量——您访问的只是数组 @databyte 的一个元素,这不会产生该错误消息。

标签: perl shell command system


【解决方案1】:

我对一些事情感到困惑,尤其是您在 system 呼叫中的尾随 "n"。那应该是"\n" 吗?因为在这种情况下这是不必要的和错误的。

主要问题是你有

for ( $mj = 0; $mj < 256; $mj++ ) { .. }

然后在@databyte 只有十二个元素时访问$databyte[$mj]。很难知道您的意思。

我会这样写一些有用的东西,但可能不是你的意图。

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");
}

它只处理所有确实存在并匹配模式的文件。

【讨论】:

    【解决方案2】:

    我复制/粘贴了您的代码,只替换了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");
    

    【讨论】:

    • Erm ...但是您还没有看到system调用的程序!
    • 抱歉,我不明白?错误消息来自显示的程序。
    • 你说你"只对system调用的程序做了修改,但是你没有看到那个程序的代码,你怎么能有对其进行了更改?
    • 意思是说什么叫什么。
    • 好的,但这意味着同样的事情。您的意思是“我只对system调用的参数进行了更改”
    猜你喜欢
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    相关资源
    最近更新 更多