1

ここでランク初心者は優しくしてください... 特定のファイルタイプをすべて見つけて呼び出すプログラムと、ファイルタイプを変換する newstack という別のプログラムを perl で書いています。

newstack oldfileame newfilenameシェルから実行すると、正常に動作します。

私のプログラムがsystem("newstack oldfileame newfilename")newstack を実行すると、エラーが返されます:

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

同じことを行うシェル スクリプトを作成し、ファイルに対して一度に 1 つずつ 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し、問題を修正しました

4

1 に答える 1

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";
于 2012-08-01T14:50:28.597 に答える