シェルはb*.txt
、現在のディレクトリ内の一致するファイルのリストに展開しようとしています。プログラムがこれらの値を受け取ると、glob
次のようになります
@files = </home/ckhau/database/experiment/test/b1.txt b3.txt b3.txt>
これはあなたが望むものではなくb1.txt
、$RUN_DIR
ディレクトリにない場合、ファイルを見つけることができません
シェルがワイルドカード ファイル パターンをグロビングするのを防ぐには、引用符で囲む必要があるため、コマンドは次のようになります。
perl Test.pl 'b*.txt'
それを超えて、あなたのプログラムは本当に改善する必要があります。常に すべてのプログラムの先頭で、最初に使用する時点ですべての変数を宣言する必要がuse strict
あります。配列全体ではなく、ファイル パターンとしてuse warnings
の最初の要素だけを実際に使用する必要があります。@ARGV
また、スカラー変数の内容が必要な場合に、スカラー変数を引用符で囲むのは間違っています。
オリジナルのこのリファクタリングを見てください
#!/usr/bin/perl
use strict;
use warnings;
my $run_dir="/home/ckhau/database/experiment/test";
my $pattern = "$run_dir/$ARGV[0]";
my $index = -999;
my @files = glob $pattern;
foreach my $file (@files) {
my $script = "perl abc.pl '$file'";
system $script;
}
アップデート
パラメータとして複数のワイルドカード パターンを使用したい場合は、それぞれの先頭にディレクトリをTest.pl
パッチする必要があります。$run_dir
これを行う最善の方法は、File::Spec
モジュールのrel2abs
関数を使用することです。完全なスクリプトは次のようになります
#!/usr/bin/perl
use strict;
use warnings;
use File::Spec;
my $run_dir="/home/ckhau/database/experiment/test";
my $pattern = join ' ', map File::Spec->rel2abs($_, $run_dir), @ARGV;
my $index = -999;
my @files = glob $pattern;
foreach my $file (@files) {
my $script = "perl abc.pl '$file'";
system $script;
}