Просмотр системы perldoc -f , примечание:
Если в LIST имеется более одного аргумента или если LIST является массивом с более чем одним значением, запускается программа, заданная первым элементом списка, с аргументами, заданными остальной частью списка. Если есть только один скалярный аргумент, этот аргумент проверяется на наличие метасимволов оболочки, и, если они есть, весь аргумент передается командной оболочке системы для анализа
Вы вызываете system LIST
, поэтому >
заканчивается передачей dot
вместо интерпретации оболочкой.
Я бы порекомендовал вам продолжать использовать system LIST
, потому что это немного безопаснее, чем пропускать все через оболочку. Согласно документации, вы можете указать выходной файл, используя опцию -o
для dot
, так что сделайте это.
Если вы действительно хотите поставить точки i s и пересечь ваши t s (каламбур не предназначен), то вы можете использовать:
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;
}