Perl:命令可以从shell而不是system()

时间:2012-08-01 14:16:57

标签: perl

排名初学者请温柔...... 我在perl中编写一个程序,它找到所有特定的文件类型和调用,另一个程序叫做newstack来转换文件类型。

当我从我的shell运行newstack oldfileame newfilename时,它运行正常。

当我的程序运行system("newstack oldfileame newfilename")时,newstack会返回错误:

ERROR: NEWSTACK - NO INPUT FILE SELECTED
sh: line1: ./oldfilename: cannot execute binary file

如果我编写一个执行相同操作的shell脚本,一次在文件上运行newstack它可以正常工作。在perl程序的上下文中运行时,为什么它会失败?

Newstack来自IMOD程序套件,我不知道它是什么写的。文件是mrc文件,它们是二进制图像文件。

编辑::这是所要求的实际代码:

print "Enter the rootname of the files to be converted: ";
my $filename = <STDIN>;
chop $filename;

my @files = qx(ls $filename*.mrc);     
open LOGFILE, (">modeconvert-log");     
foreach my $mrc (@files)           
{        
print LOGFILE "$mrc";       
system("newstack -mode 2 $mrc $mrc");     
} 
my $fileno = @files;
print "$fileno files converted\n";

我在第8行之后添加了chop $mrc并解决了问题

1 个答案:

答案 0 :(得分:2)

您发布的代码和您执行的代码有所不同。在您执行的代码中,newstack

后面有换行符
$ perl -e'system("who\n oldfileame newfilename")'
sh: line 1: oldfileame: command not found

使用chomp($x)$x =~ s/\s+\z//;删除换行符。


my @files = qx(ls $filename*.mrc);

应该是

my @files = qx(ls $filename*.mrc);
chomp @files;

或者更好:

my @files = glob("\Q$filename\E*.mrc");

以上和其他修正:

use IPC::System::Simple qw( system );                          # Replaces system with one that dies on Checks for errors.

open(my $LOGFILE, '>', 'modeconvert-log')                      # Avoids global vars.
   or die("Can't create log file \"modeconvert-log\": $!\n");  # Adds useful error checking.

print "Enter the rootname of the files to be converted: ";
my $filename = <STDIN>;
chomp $filename;                                               # chomp is safer.

my @files = glob("\Q$filename\E*.mrc");                        # Works with file names with spaces, etc.

for my $mrc (@files) {
   print $LOGFILE "$mrc\n";                                    # Was missing a newline.
   system("newstack", "-mode", "2", $mrc, $mrc);               # Works with file names with spaces, etc.
} 

print 0+@files, " files converted.\n";