3

引数値/コマンド ライン引数の割り当てに問題があります。これが私が実際にやりたいことです。

Test.pl
#!/usr/bin/perl

#Variable declaration

$RUN_DIR="/home/ckhau/database/experiment/test";
    #Main program

$index=-999; 
#my $ARGV;
@files = <$RUN_DIR/b*.txt>;

foreach $file (@files)
{
 #$SCRIPT="perl abcdinfo.pl $file";
 $SCRIPT="perl abc.pl $file";
 system("$SCRIPT");       
}

b*.txt を @ARGV に置き換えて、プログラムを実行しようとしました。つまり、上記のコードを

@files = <$RUN_DIR/@ARGV>;

次に、コマンドラインで実行してみてください

perl Test.pl b*.txt

これにより、perl: no match というエラーが表示されます。誰でも次のことで私を助けることができます.

これにコマンドライン引数を使用する方法???

コマンドライン「b*.txt」または「r_*.txt」でこれらの種類の構文を使用できますか???

4

1 に答える 1

3

シェルは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;
}
于 2012-09-17T01:57:27.790 に答える