特定のパターン、たとえば "abc"で始まるディレクトリ内のファイルを検索する必要があります。私はまた結果で ".xh"で終わるすべてのファイルを削除する必要があります。私はPerlでそれをやり遂げる方法についてはわかりません。パターンによるファイル名のフィルタリング
私はこのようなものがあります:私もすべて、また "・XH" で終わる結果から、すべてのファイル
おかげで、バイ
特定のパターン、たとえば "abc"で始まるディレクトリ内のファイルを検索する必要があります。私はまた結果で ".xh"で終わるすべてのファイルを削除する必要があります。私はPerlでそれをやり遂げる方法についてはわかりません。パターンによるファイル名のフィルタリング
私はこのようなものがあります:私もすべて、また "・XH" で終わる結果から、すべてのファイル
おかげで、バイ
はMYDIRは、ディレクトリのパスを含む文字列です
@files = grep {!/\.xh$/} <$MYDIR/abc*>;
を試してみてください。
foreach $file (@files)
{
my $fileN = $1 if $file =~ /([^\/]+)$/;
if ($fileN =~ /\.xh$/)
{
unlink $file;
next;
}
if ($fileN =~ /^abc/)
{
open(FILE, "<$file");
while(<FILE>)
{
# read through file.
}
}
}
を排除する必要が
opendir(MYDIR, $newpath);
my @files = grep(/abc\*.*/,readdir(MYDIR)); # DOES NOT WORK
をディレクトリ内のファイルにアクセスするには、次のようにします。
$DIR = "/somedir/somepath";
foreach $file (<$DIR/*>)
{
# apply file checks here like above.
}
代わりに、PerlモジュールFile :: findを使用することができます。
opendir(MYDIR、$ newpath);私の@files = grep(/ abc *。* /、readdir(MYDIR)); #DOES NOT WORK
グレッグパターンと正規表現パターンを混同しています。
#!/usr/bin/perl
use strict;
use warnings;
opendir my $dir_h, '.'
or die "Cannot open directory: $!";
my @files = grep { /abc/ and not /\.xh$/ } readdir $dir_h;
closedir $dir_h;
print "$_\n" for @files;
opendir(MYDIR, $newpath) or die "$!";
my @files = grep{ !/\.xh$/ && /abc/ } readdir(MYDIR);
close MYDIR;
foreach (@files) {
do something
}
kevinadcとシナンUnurを使用しますが言及されていないという点は、リストコンテキストで呼び出されたときreaddir()
は、ディレクトリ内のすべてのエントリのリストを返すということです。その上で任意のリスト演算子を使用できます。あなたが使用できる理由です:だから
my @files = grep (/abc/ && !/\.xh$/), readdir MYDIR;
:
readdir MYDIR
MYDIR内のすべてのファイルのリストを返します
。
そして:
grep (/abc/ && !/\.xh$/)
が条件に一致するreaddir MYDIR
によって返されたすべての要素を返します。
2番目のチェックを/\.xh$/に変更すると、正しいことがチェックされます。 :) –
代わりのopendir
とフィルタリングreaddir
を使用して(!closedir
に忘れないように)、あなたの代わりにglob
を使用することもできます。
use File::Spec::Functions qw(catfile splitpath);
my @files =
grep !/^\.xh$/, # filter out names ending in ".xh"
map +(splitpath $_)[-1], # filename only
glob # perform shell-like glob expansion
catfile $newpath, 'abc*'; # "$newpath/abc*" (or \ or :, depending on OS)
マップやスプリットパスは必要ありません。どちらかが.xhで終わるか、それとも終わらないか。余分な仕事はそれを変えない。 –
ハァッ? glob( "./abc *")は( "./abc.txt"、 "./abc.xh")を返します。あなたはそれを( "abc.txt")まで動かすことを他にどのように期待していますか? – ephemient
文字列の最後にその正規表現を固定して、その正規表現をエスケープする必要があります。どういうわけか(私は文字クラスを使うのが好きです)。あなたの正規表現は "abcxh.txt"にマッチします。代わりに/[.]xh$/を試してください。 –
ありがとう - これはうまくいった! –
奇妙なことに、私はこの回答を正しくフォーマットすることに多くの問題を抱えていました。私は期間をエスケープしましたが、エスケープから脱出しない限り表示されません。また、<と>は闘争でした! $ anchorをキャッチしてくれてありがとう、私はそのケースについてはテストしなかった。 修正済み。 –