1.25.2012

Perl: Return value of glob() built-in function

Perl: glob 関数の戻り値について

glob 関数は、OSのシェルを起動しワイルドカードを含む文字列に対してパス展開を行うときに使う。

しかし、ワイルドカードを使用しない場合はパス展開処理が行われず、そのまま文字列がリストに格納される。
空文字列も同様、そのままリストに格納されることとなる。

glob 関数の戻り値に含まれているからといって、決してそのファイルの存在が保証されている訳ではない。
空文字列が含まれている可能性さえある。

従って、glob の結果に対して stat する場合などは常にその結果を検査するべきである。

・xで始まる名前のファイルが無い前提

#!/usr/bin/env perl
use strict;
use warnings;

sub p {
    print '(', @_ ? "'" . join("', '" , @_) . "'" : q(), ")\n";
}

p(glob '');
p(glob ' ');
p(glob 'x');
p(glob 'x?');
p(glob 'x*');
p(glob '[x]');
p(glob '{x}');
p(glob 'x x? x* [x] {x} ""');

・出力結果

('')
('')
('x')
()
()
()
('x')
('x', 'x', '')

・stat の例

use Carp;
use English qw( -no match vars );

my $path = 'x';

for my $file (glob $path) {
    my $result = stat $file
        or croak "Couldn't stat '$file': $OS_ERROR";
}

0 件のコメント:

コメントを投稿