8

「abc」などの特定のパターンで始まるディレクトリ内のファイルを検索する必要があります。また、結果から「.xh」で終わるすべてのファイルを削除する必要があります。Perl でそれを行う方法がわかりません。

私はこのようなものを持っています:

opendir(MYDIR, $newpath);
my @files = grep(/abc\*.*/,readdir(MYDIR)); # DOES NOT WORK

「.xh」で終わるすべてのファイルを結果から除外する必要もあります

ありがとう、ビー

4

6 に答える 6

7

試す

@files = grep {!/\.xh$/} <$MYDIR/abc*>;

ここで、MYDIR はディレクトリのパスを含む文字列です。

于 2009-06-11T21:18:07.707 に答える
7

opendir(MYDIR, $newpath); 私の @files = grep(/abc*.*/,readdir(MYDIR)); #動作しません

正規表現パターンとグロブ パターンを混同しています。

#!/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;
于 2009-06-11T21:20:15.063 に答える
3
opendir(MYDIR, $newpath) or die "$!";
my @files = grep{ !/\.xh$/ && /abc/ } readdir(MYDIR);
close MYDIR;
foreach (@files) { 
   do something
}
于 2009-06-11T21:31:24.693 に答える
2

kevinadc と Sinan Unur が使用しているが言及していない点はreaddir()、リスト コンテキストで呼び出されたときにディレクトリ内のすべてのエントリのリストを返すことです。その後、その上で任意のリスト演算子を使用できます。そのため、次を使用できます。

my @files = grep (/abc/ && !/\.xh$/), readdir MYDIR;

そう:

readdir MYDIR

MYDIR 内のすべてのファイルのリストを返します。

と:

grep (/abc/ && !/\.xh$/)

によって返されたすべての要素のうちreaddir MYDIR、その条件に一致するものを返します。

于 2009-06-11T21:40:19.540 に答える
-1

使用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)

$newpathの結果の接頭辞を削除する必要がない場合は、を削除してglobくださいmap+splitpath

于 2009-06-12T17:45:58.613 に答える
-1
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.
          }
    }
 }

また、次のようにして、ディレクトリ内のすべてのファイルにアクセスできます。

$DIR = "/somedir/somepath";
foreach $file (<$DIR/*>)
{
  # apply file checks here like above.
}

別の方法として、Perl モジュール File::find を使用することもできます。

于 2009-06-11T21:07:26.483 に答える