gpt4 book ai didi

perl - 为什么我的 Perl 系统调用失败并出现点?

转载 作者:行者123 更新时间:2023-12-02 08:59:25 25 4
gpt4 key购买 nike

我是 Perl 的初学者,在使用“系统”调用时遇到一些问题。这是我尝试执行 2 个 shell 命令的一小段代码:

# First command is :
# dot -Tpng $dottmpfile > $pngfile
# Second command is :
# rm $dottmpfile

if (!($pngfile eq "")) {
my @args = ("dot", "-Tpng", $dottmpfile, " > ", $pngfile);
system (join (' ' , @args ))
or die "system @args failed : $!";

unlink $dottmpfile;
}

编辑:现在这是我的代码,但我仍然收到错误:

system dot -Tpng toto.dot  >  toto.png failed : Inappropriate ioctl for device at /home/claferri/bin/fractal.pl line 79.

我用过system生成这段代码。

最佳答案

查看 perldoc -f system ,注意:

If there is more than one argument in LIST, or if LIST is an array with more than one value, starts the program given by the first element of the list with arguments given by the rest of the list. If there is only one scalar argument, the argument is checked for shell metacharacters, and if there are any, the entire argument is passed to the system's command shell for parsing

您正在调用system LIST,因此>最终会被传递给dot,而不是由shell解释。

我建议您继续使用system LIST,因为它比通过 shell 传递所有内容要安全一些。根据文档,您可以通过使用 dot-o 选项来指定输出文件,所以就这样做。

如果您确实想在 i 上加点并在 t 上划线(不是双关语),那么您可以使用:

if ( defined $pngfile and $pngfile ne '') {
my @args = (dot => '-Tpng', $dottmpfile, "-o$pngfile");
if ( system @args ) {
warn "'system @args' failed\n";
my $reason = $?;
if ( $reason == -1 ) {
die "Failed to execute: $!";
}
elsif ( $reason & 0x7f ) {
die sprintf(
'child died with signal %d, %s coredump',
($reason & 0x7f),
($reason & 0x80) ? 'with' : 'without'
);
}
else {
die sprintf('child exited with value %d', $reason >> 8);
}
}
warn "'system @args' executed successfully\n";
unlink $dottmpfile;
}

关于perl - 为什么我的 Perl 系统调用失败并出现点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2469499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com