Perl: glob 関数の戻り値について
glob 関数は、OSのシェルを起動しワイルドカードを含む文字列に対してパス展開を行うときに使う。
しかし、ワイルドカードを使用しない場合はパス展開処理が行われず、そのまま文字列がリストに格納される。
空文字列も同様、そのままリストに格納されることとなる。
glob 関数の戻り値に含まれているからといって、決してそのファイルの存在が保証されている訳ではない。
空文字列が含まれている可能性さえある。
従って、glob の結果に対して stat する場合などは常にその結果を検査するべきである。
・xで始まる名前のファイルが無い前提
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/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} ""' ); |
・出力結果
1 2 3 4 5 6 7 8 | ('') ('') ('x') () () () ('x') ('x', 'x', '') |
・stat の例
1 2 3 4 5 6 7 8 9 | 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 件のコメント:
コメントを投稿