-1

友達私はディレクトリからファイル名を読み取り、それらの名前を出力するこのコードを持っています

opendir DIR1,  "defaults" or die "cannot open dir: $!";#open the given dir
        my @default_files=readdir DIR1;
        foreach my $fls(@default_files){ 
                        chomp($fls); 
                        print "$fls\n";
           }

上記のコードを実行すると、

.
..
PGR.csv
report.csv
std_headers.csv
tab_name.txt

最初の2行は何ですか?前もって感謝します

4

4 に答える 4

2

より簡単な代替手段は、次のglob関数を使用することです。

my @default_files = glob 'defaults/*';

または:

my @default_files = <defaults/*>;

.これらの関数は、シェルと同じように、で始まるファイルとディレクトリのエントリを除外します。

于 2013-03-24T11:34:04.683 に答える
1

最初の行は次のとおりです。

  • .現在アクセスしているディレクトリへのリンク。

  • ..アクセスしているディレクトリ(親ディレクトリ)の上のディレクトリにリンクします。

編集:

両方の名前付きエントリを除外する1つの可能性は、次を使用することgrepです。

opendir DIR1, "tmp" or die "cannot open dir: $!";
my @default_files= grep { ! /^\.\.?$/ } readdir  DIR1;

foreach my $fls (@default_files) { 
   chomp($fls); 
   print "$fls\n";
}
于 2013-03-24T11:23:24.250 に答える
0

「。」は現在の作業ディレクトリを意味し、「..」は現在の作業ディレクトリの親ディレクトリを意味します

于 2013-03-24T11:24:46.610 に答える
0

ディレクトリリストで.は、はWorking Directory..表し、ParentDirectoryを表します。

スカラーコンテキストでは、これらのエントリを明示的にチェックすることで、これらのエントリをスキップできます。

while (defined(my $next = readdir $dir)) {
    next if $next =~ /\A[.][.]?\z/;
    # ...
}

またはリストコンテキストで:

my @entries = grep !/\A[.][.]?\z/, readdir $dir;

すでにFile::Slurpread_dirを使用している場合は、それが提供する関数を使用することを好みます。以下は自動的にスキップ...、ディレクトリへのパスを返された各エントリの前に追加します。

 my @paths = read_dir('/path/to/dir', prefix => 1);
于 2013-03-24T13:32:02.350 に答える