0

我正在尝试将标量值传递给系统命令,但一直遇到问题。我不确定为什么。在这个深夜,任何帮助将不胜感激。

我得到的两个错误是:

  • 语法错误;键的不可打印字符。

  • 执行 CMD 查找时出错。

本质上,我试图在命令“命令”中传递一串命令(dbcommand;f;echo;...)。

my $id_to_test = $ids[0];
my $cmd = q{command -c "dbcommand -a app-f fam -d db; f sub=a, device=};

$cmd .= q{$id_to_test};

$cmd .= q{, analog=A; echo -c on; echo -o A_value.txt; /DIS;"};

system $cmd;

#system('command-c "dbcommand-a app-f fam-d db; f sub=a, device=$id_to_test, analog=A; echo -c on; echo -o A_value.txt; /DIS;"');

所以现在我在做:

my $id_to_test = $ids[0];
my $cmd = 'command-c \"dbcommand-a app-f fam -d db; f sub=a, device=';
$cmd .= "$id_to_test";
$cmd .= ', analog=A; echo -c on; echo -o A_value.txt; /DIS;\"';
system $cmd;

我得到了错误:

  • 语法错误;cmd 包含无效字符 -- “dbcommand sh: f: command not found -c on -o A_value.txt sh: /DIS: No such file or directory sh:”: command not found

如果我打印 $cmd; 相反,我的双引号前面也有斜杠,这不是我想要的:

command -c \"dbcommand -a app -f fam -d db; find sub=a, device=1234567, analog=A; echo -c on; echo -o A_value.txt; /DIS;\"

确保数组已填充:

我做的第一件事是确保通过声明数组、打开文件然后执行以下操作来正确地向数组添加值:

while (<$fh>) {
#Remove any newline characters from line using the chomp() command.
    chomp;
    push @ids, "$_";
#   print($ids[$index]);
#   $index = $index + 1;
#   print "$row\n";
}

print join (", ", @ids);
my $array_size = @ids;
print("\n" . $array_size);

当我执行 perl 脚本并在本地打印时*,一切都如预期的那样——打印了值并且数组的大小为 3。

123456789, 123456888, 123456789

3

但是,当我远程打印时,我只得到最后一个元素

, 123456789

3

即使数组的大小也是 3。

4

1 回答 1

0

问题是当您使用单引号(无插值)时,它会将反斜杠视为文字反斜杠。我唯一能想到在使用单引号时需要反斜杠作为转义字符的地方是当您转义单引号本身或反斜杠时:

print 'I said \'hello.\'';

尝试这样的事情:

my $cmd = 'command -c "dbcommand -a app-f fam -d db; f sub=a, device=' .
    $id_to_test . ', analog=A; echo -c on; echo -o A_value.txt; /DIS;';

这也应该有效:

my $cmd = 'command -c "dbcommand -a app-f fam -d db; f sub=a, device=' .
    "$id_to_test, analog=A; echo -c on; echo -o A_value.txt; /DIS;";

(或者您可以将其包装在一个大""/q{}中而无需连接运算符)。

而且,正如其他人所暗示的那样,qq{}它本质上是“”,还有一个额外的优点是您可以包含双引号字符而不必转义它们。

于 2015-09-03T11:54:46.477 回答