2

Perl ファイル名のワイルドカード コマンドには、 と の 2 つの形式があり<>ますglob。しかし、これら 2 つの形式の効果には違いがあることがわかりました。

次のコードを使用して、類似した名前のすべてのファイルを取得したい:

my @files = <"rawdata/*_${term}_*.csv">;   #(1)

および別の形式:

my @files = glob "rawdata/*_${term}_*.csv";  #(2)

これら 2 つのコードを使用して同じ結果が得られることを期待しています。ただし、違いがあります。$termがスペースのない文字列 (つまり、1 つの単語) の場合、(2) はうまく機能しますが、(1) は機能しません。がスペース (または複数の単語) を含む文字列の場合、$term(1) はうまく機能しますが、(2) は機能しません。

この二つの表現に違いはありますか?どうもありがとう。

4

2 に答える 2

4

ここでの違いは、引用符の使用にあります。ドキュメントから:

glob はその引数を空白で分割し、各セグメントを個別のパターンとして扱うことに注意してください。

山括弧 <> を使用する場合、引用符は必要ありません。グロブには引用符が必要です。したがって、以下は同等です。

my @files = <rawdata/*_${term}_*.csv>;
my @files = glob "rawdata/*_${term}_*.csv";

${term} にスペースが含まれている場合、どちらもパターンを分割します。<> フォームに引用符を導入すると、スペースを含む ${term} でこの分割が発生するのを防ぎ、別のパターンを検索します。

于 2012-08-24T20:07:22.067 に答える
4

<SomeStuff>と同等です(ファイルハンドルからの読み取りにも使用されるglob "SomeStuff"すべてのあいまいさを除けば、そこを見て探してください)。したがって、あなたの例は同等ではありません。使用する必要があります<>perldoc perlopI/O Operators

my @files = glob "\"rawdata/*_${term}_*.csv\"";  #(2)

代わりは。

ただし、パターンのスペースが違いを生む理由については、次のとおりperldoc -f globです。通常のglob(したがって<>を介して実装されるglob) は、空白をパターンセパレータとして扱います。ドキュメントには、スペースをパターンセパレーターとして扱わないFile::Globその機能についても言及されています。bsd_globしたがって、代わりにこれを使用することを検討してください。

use File::Glob ':glob';

my $term1  = "some stuff";
my @files1 = glob "dir/${term1}*";
my $term2  = "more";
my @files2 = glob "dir/${term2}*";

print join(' :: ', sort @files1), "\n", join(' :: ', sort @files2), "\n";

作成したばかりのいくつかのファイルで可能な出力:

[0 mosu@tionne ~/tmp] ~/test/test1.pl
dir/some stuff is betther than other stuff.doc :: dir/some stuffy teachers.txt
dir/more beer.txt :: dir/more_is_less.csv
于 2012-08-24T20:08:34.193 に答える