1

ディレクトリからすべての画像を読み込み、配列に保存したいと思います。

@files = `ls $ARGV[0] | grep -i -E jpe?g|gif|png$`;

この行でエラーが発生します:Final $ should be \$ or $name

@files = `ls $ARGV[0] | grep -i -E \'jpe?g|gif|png$\'`;

この行は機能しますが、画像 "img.jpg.bmp" もロードし、それは私が望んでいるものではありません。私は何を間違っていますか?

4

2 に答える 2

2

glob関数を使用してファイルのリストを取得し、grepでそれらをフィルタリングすることもできます。例えば:

my(@files) = grep { /\.(?:jpe?g|gif|png)\z/ } glob '"*"';

または単に:

my(@files) =  glob '"*.jpeg" "*.jpg" "*.gif" "*.png"';
于 2013-05-01T11:56:55.337 に答える
0

シェルを使用してディレクトリを読み取ったり、に移動したりするgrepのはちょっと悲しい

use autodie;
opendir my $dir, $ARGV[0];
my @files = grep !/\A\.\.?\z/ && /\.(?:jpe?g|gif|png)\z/, readdir $dir;
closedir $dir;

.(現在のディレクトリと親ディレクトリを手動で除外する必要があり..ます。\A^\z少し似$ていますが、常に文字列の末尾に一致します)

あなたの問題`command`は、二重引用符で囲まれた文字列の補間セマンティクスがあることでした。$ alwaysは、次の単語または文字が変数名であることを示します(正規表現を除く)。は$`prematch variabele になりますが、Perl は賢く、あなたがそれを望まないことを認識します。エラーメッセージが示唆する解決策は、次をエスケープすること$です:

`grep -i -E jpe?g|gif|png\$` # … and it meant this.
# It still thinks gif and png are commands
`grep -i -E '(jpe?g|gif|png)\$'` # regex correctly quoted on shell level

一重引用符で囲むことは、エラー メッセージが発生した Perl レベルではなく、シェル レベルでのみ役立ちます。

正規表現では、行末アサーションはor$のような通常のアトムです。orとは異なり、これは演算子ではありません。したがって、括弧で正しい優先順位を強制する必要があります。これがどのように行われるかについては、上記の私が提案した Perl ソリューションの正規表現を参照してください。p[abc]()|[]

于 2013-05-01T11:33:42.147 に答える