SORU
1 EKİM 2009, PERŞEMBE


Nedenleri üzerinde Perl readdir (ya da tersi) şu tercih için ne var?

Bu soru this one spin-off. Bazı geçmiş: ben ilk Perl öğrendiği zaman, ben çok daha kolay buldum çünkü hep* readdir *5 yerine glob kullanılır. Daha sonra çeşitli görevlerde ve okumalar glob kötü oldu, ve şimdi ben hemen hemen her zaman readdir kullanmasını önerdi.

this recent question üzerinde düşündükten sonra ya da diğer bir tercih sebebim Ranza olabileceğini fark ettim. Bu yüzden, bazı artıları ve eksileri ortaya koymak için gidiyorum, ve daha deneyimli Perl Millet düşmek ve açıklık umuyorum. Özetle soru şu: orada zorlayıcı sebepler readdir glob readdir glob tercih (bazı veya tüm durumlarda).

glob artıları:

  1. Dotfiles onlara sormadan () hayır
  2. Öğeleri sipariş garantilidir
  3. Hiçbir öğe üzerine dizin adını elle önüne gerekiyor
  4. Daha iyi bir isim (hadi - glob karşı readdir isimler tarafından yalnız yargılıyoruz eğer bir yarış değil)
  5. (Ysth cevabı; cf. glob 4 eksilerini aşağıda) mevcut olmayan dosya adları: geri dönebilirsiniz

    @deck = glob "{A,K,Q,J,10,9,8,7,6,5,4,3,2}{\x{2660},\x{2665},\x{2666},\x{2663}}";
    

glob eksileri:

  1. Eski sürümleri sadece düz (ama 'eski' anlamına geliyor, ve eğer ön 5.6 Perl kullanıyorsanız açıkçası 5.6, ön daha büyük bir problemin var) . kırık
  2. Calls stat each time (yani, çoğu durumda stat işe yaramaz kullanın).
  3. spaces in directory names ile ilgili sorunlar (bu hala geçerli mi?)
  4. (Brian'ın cevabı) var olmayan dosya adları geri dönmeyecek

    $ perl -le 'print glob "{ab}{cd}"'
    

* *22 artıları:

  1. (Brian'ın cevabı) opendir programda pass civarında olan bir filehandle (ve yeniden) verir, ama glob sadece bir liste verir
  2. (Brian'ın cevabı) readdir uygun bir yineleyici ve fonksiyonları, *, telldir*27 26* *sağlar
  3. Daha hızlı? (Saf tahmin globbazılarına göre'yukarıdan ler vardır. Optimizasyon zaten bu seviye için çok endişeli değilim, ama teorik bir pro.)
  4. glob daha az eğilimli kenarı-örnek böcek?
  5. Her şey (dotfiles) varsayılan olarak (bu da bir tezgah mı) okur
  6. Bir dosya için ikna olabilir. 0 (bir con - Brad cevap Ayrıca bakınız)
  7. Herkes? Bueller? Bueller?

readdir eksileri:

  1. Eğer dizin adını önüne hatırlamıyorsun bile, senfiletests veya kopyala öğeleri veya öğeleri ya da... düzenleme yapmaya çalıştığınızda bit olsun
  2. . .. öğeler grep hatırlamıyorsun bile, senöğeleri sayarken bit veya dosya ağacı... veya yinelemeli olarak yürümeye çalışın
  3. Dizin ismi ön yerleştirmeyi söylemiş miydim? (Bir not, ama Perl yeni Başlayanlar posta listesine ilk yazıma klasik, "Neden bu kod filetests içeren bazı zamanlar çalışmıyor? bu gotcha ile ilgili sorun". Görünüşe göre, hala kızgınım.)
  4. Öğeleri belirli bir sırayla döndürülür. Bu sık sık bir şekilde sıralamak için hatırlamak zorunda kalırsınız. (Bu, eğer daha fazla hız anlamına gelir, ve eğer gerçekten önemliyse bir yanlısı olabilirdüşünüyorumeğer öğeleri sıralamak gerekirse nasıl ve.)Edit: Cesedi ... küçük bir örnek, ama alfabetik sırayla Mac readdir iade öğeler, büyük / küçük harf duyarlı. Debian bir kutu bilginin bulunması sonucu ortaya çıkacak bir sunucuda, sırası tamamen rasgele. Apple'ın yerleşik Perl (5.8.8) ile Mac ve kendi derlenmiş benim 5.10.1 test ettim. Debian kutusu OpenBSD makine gibi 5.10.0. Eğer bu dosya sisteminde bir sorun varsa, Perl yerine acaba?
  5. Her şey (dotfiles) varsayılan olarak (bu da bir pro) okur
  6. Mutlaka bir dosya 0 (artıları da görmek - Brad cevap) adlı . ile anlaşma yok

CEVAP
1 EKİM 2009, PERŞEMBE


Bunların arasında en önemli, en büyük fark kaçırdın: glob tekrar sana bir liste verir, ama opendir dizinin ele verir. Dizin çevresindeki diğer nesneler veya değişmezler bunu kullanmak için ele geçirmek. Dizin saplı, alt yordamı veya nesnenin başka kimlerin kullandığını nereden geldiği hakkında hiçbir şey, bilmek zorunda değil:

 sub use_any_dir_handle {
      my( $dh ) = @_;
      rewinddir $dh;
      ...do some filtering...
      return \@files;
      }

Bu dirhandle, glob ile bir sonraki öğeyi almak olsa da etrafında seekdir ile hareket kontrol edilebilir bir yineleyici.

Bir şey olsa da, maliyet ve faydaların sadece belirli bir bağlam uygulandığında mantıklı. Belirli bir kullanım dışında yoklar. Farklılıklarını mükemmel bir liste var, ama onlarla yapmaya çalıştığını bilmeden bu farklılıkları sokmazdım.

Başka bir şey hatırlamak için:

  • opendir ama başka türlü olmaz kendi topak uygulayabilirsiniz.

  • şu kendi joker sözdizimini kullanır, ve hepsi bu.

  • şu var olmayan dosya adları geri dönmeyecek

    $ perl -le 'print glob "{ab}{cd}"'
    

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 8bitdigitaltv

    8bitdigitalt

    31 AĞUSTOS 2011
  • Jack Vale Films

    Jack Vale Fi

    8 ŞUBAT 2007
  • Smith Micro Graphics

    Smith Micro

    15 Mayıs 2008