この質問は、これから派生したものです。いくつかの歴史:私が最初にPerlを学んだとき、私はそれがより簡単であると思ったので、ほとんど常に+glob
ではなく使用しました。その後、さまざまな投稿や読み物がそれが悪いことを示唆したので、今ではほとんどいつもを使用しています。opendir
readdir
glob
readdir
この最近の質問を考えた後、私はどちらか一方の選択の理由が二の次であるかもしれないことに気づきました。それで、私はいくつかの賛否両論をレイアウトするつもりです、そして私はより経験豊富なPerlの人々がチャイムを鳴らして明確にすることができることを望んでいます。一言で言えば、(一部またはすべての場合に)好むまたは好むやむを得ない理由があるかどうかというglob
質問readdir
です。readdir
glob
glob
長所:
- ドットファイルはありません(要求しない限り)
- アイテムの注文は保証されています
- ディレクトリ名をアイテムに手動で追加する必要はありません
- より良い名前(名前だけで判断する場合は、
glob
コンテストreaddir
ではありません) (ysthの回答から。以下の
glob
短所4を参照)存在しないファイル名を返すことができます。@deck = glob "{A,K,Q,J,10,9,8,7,6,5,4,3,2}{\x{2660},\x{2665},\x{2666},\x{2663}}";
glob
短所:
- 古いバージョンは単純に壊れています(しかし、「古い」は5.6より前のことを意味します。率直に言って、5.6より前のPerlを使用している場合は、より大きな問題があります)
stat
毎回呼び出します(つまり、stat
ほとんどの場合、無駄に使用します)。- ディレクトリ名のスペースに関する問題(これはまだ本当ですか?)
(ブライアンの回答から)存在しないファイル名を返すことができます:
$ perl -le 'print glob "{ab}{cd}"'
readdir
長所:
- (ブライアンの答えから)
opendir
プログラムで渡す(そして再利用する)ことができるファイルハンドルを返しますが、glob
単にリストを返します - (ブライアンの答えから)
readdir
は適切なイテレータであり、、、に関数を提供しrewinddir
ますseekdir
。telldir
- もっと早く?(上からのいくつかの機能に基づいた純粋な推測
glob
。とにかくこのレベルの最適化についてはあまり心配していませんが、理論的なプロです。) - エッジケースのバグが発生しにくいのは
glob
? - デフォルトですべて(ドットファイルも)を読み取ります(これも短所です)
- ファイルに名前を付けないように説得するかもしれません
0
(短所もあります-ブラッドの答えを参照してください) - 誰?ビュラー?ビュラー?
readdir
短所:
- ディレクトリ名の前に付けるのを忘れた場合は、ファイルテストを実行したり、アイテムをコピーしたり、アイテムを編集したりするときに、ビットが表示されます...
- とアイテムを忘れて
grep
しまった場合は、アイテムを数えるか、ファイルツリーを再帰的に下って行くか....
..
- ディレクトリ名の前に付けることについて言及しましたか?(補足ですが、Perl Beginnersメールリストへの私の最初の投稿は、この落とし穴に関連する古典的な「ファイルテストを含むこのコードが機能しないのはなぜですか?」という問題でした。どうやら、私はまだ苦いです。)
- アイテムは順不同で返送されます。これは、多くの場合、何らかの方法でそれらを並べ替えることを覚えておく必要があることを意味します。(これは、速度が向上し、実際にアイテムを並べ替える方法と必要性について考えることを意味する場合、プロになる可能性があります。)編集:恐ろしく小さいサンプルですが、Mac
readdir
では大文字と小文字を区別せずにアルファベット順にアイテムを返します。DebianボックスとOpenBSDサーバーでは、順序は完全にランダムです。私はAppleの組み込みPerl(5.8.8)と自分でコンパイルした5.10.1を使ってMacをテストしました。Adobeボックスは、OpenBSDマシンと同様に5.10.0です。これはPerlではなくファイルシステムの問題なのだろうか? - デフォルトですべて(ドットファイルも)を読み取ります(これもプロです)
- 名前の付いたファイルを必ずしもうまく処理できるとは限りません
0
(プロも参照してください-ブラッドの回答を参照してください)