シェルを使用してディレクトリを読み取ったり、に移動したりする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]
()
|
[]