排名初学者请温柔...... 我在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
并解决了问题
答案 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";