0

私はPerlを初めて使用しますが、次の方法でうまくいくはずだと思いました。私はより大きなperlスクリプトの次のスニペットを持っています

@mylist = ("${my_dir}AA_???_???.DAT", "${my_dir}AA???.DAT");

foreach my $list (@mylist) {
    if (-e $list) {
        system ("cp ${list} ${my_other_dir}");
    }
}

上記のスニペットはこれらのワイルドカードを見つけることAA_???_???.DATができませんが、ワイルドカードを使用してファイル名を見つけることはできますAA???.DAT

ファイルも削除しようとAA??_???.DATしました

unlink(glob(${my_dir}AA_???_???.DAT")) 

しかし、スクリプトはハングアップします。ただし、次をAA???.DAT使用してファイルの一致を削除できます。

unlink(glob("${my_dir}AA???.DAT))

理由は何ですか?

4

2 に答える 2

3

-e $listはファイルの存在をチェックするため、どちらの場合も false を返しますAA_???_???.DAT(AA???.DAT実際にその名前のファイルがある場合を除きます)。一方が機能し、もう一方が機能しないというのは真実ではありません。

unlink(glob(${my_dir}AA_???_???.DAT"))ハングすることも事実ではありません。まず、コンパイルさえしません。

于 2013-01-24T23:25:51.270 に答える
0

opendirと組み込み関数を使用readdirします (ドキュメントの例から変更):

opendir(my $dh, $some_dir) || die "can't opendir $some_dir: $!";
@mylist = grep { /^(.AA_..._...\.DAT|AA...\.DAT)$/ && -f "$some_dir/$_" } readdir($dh);
closedir $dh; 

次に、元のコードをプラグインできます。

foreach my $list (@mylist) {
    if (-e $list) {
        system ("cp $some_dir/${list} ${my_other_dir}/");
    }
}

ディレクトリの再帰的なファイル操作には、File::Find CPAN モジュールを使用するのが本当に好きです。これはサブディレクトリをトラバースし、各ファイルを指定されたサブルーチンに渡してそのファイルを処理します。例として:

#! /usr/bin/perl

use strict;
use warnings;
use File::Find;

my @dirs='/path/to/dir';
my $my_other_dir='/path/to/otherdir';

find(&process_files, @dirs);

sub process_files {
    my($file) = $_;
    my($fullpath) = $File::Find::name;

    return if($file !~ /^AA_..._...\.DAT$/ and
        $file !~ /^AA...\.DAT$/);

    system ("cp $fullpath $my_other_dir/");
}
于 2013-01-25T01:15:59.943 に答える