2011-03-18 29 views
6

Ben yetkili onaylamak veya ben Perl script shebang hattında -CSDA seçeneği hakkında bilmek ne düşündüğünü düzeltmek için birini arıyorum.Sadece shebang hattında ne -CSDA belirtildi?

-CSDA belgelenmesi için perldoc perlrun bakınız. Kısaca

  • S: girdisi hem de çıktısı için varsayılan PerlIO tabaka
  • A akışları UTF-8: STDIN, STDOUT ve STDERR UTF-8
  • D olduğu varsayılır @ARGV elementler dizeleri kodlanmış bekleniyor UTF-8
  • -CSDA için herhangi bir etkiye sahip olmak için, komut satırında perl -CSDA script.pl'daki gibi belirtilmelidir.

  • önce standart akışları zaten açılmış ve @ARGV zaten -CSDA zaten yanı komut satırında belirtilen sürece karşılaşıldı zaman tarafından doldurulan olurdu çünkü sessizce başarısız olur shebang hattında 5.10, -CSDA için. Sadece shebang satırında görüntülenir 5.10 sonra

  • , -CSDA çünkü bu sorun croak için perl neden olur.

  • ile çalışmak için kullanılan -CSDA ile bir komut dosyası perl s öncesi 5.10 komut satırında bu seçenekler (ve seçenekleri ile çağrılan asla çünkü üzerinde sadece belirtilmişse -CSDA, shebang hattından kaldırıldı olmalı Shebang hattı, hiçbir şey yapmadı.

Yukarıdaki varsayımlarımın yanlış olduğu konusunda katı bir geri bildirim almak isterim.

cevap

3

Öyleyim ama bu nasıl çalıştığını biliyorum nasıl yetkili emin değilim.

  • İlk varsayım neredeyse doğrudur. SDA seçeneklerinin herhangi bir etkisi olması için, yorumlayıcı başlatıldığında mevcut olmalıdırlar. Bu komut satırında -CSDA nedeniyle olabilir, ya da PERL_UNICODE ortam değişkeni, ya da muhtemelen farkında olduğum başka bir yöntem nedeniyle olabilir.
  • Kişisel İkinci varsayım en azından 5.8.8 için doğrudur. D bayrağının, betik tarafından açılan akışlar için normal etkisini hala devam ettireceğini unutmayın.
  • Üçüncü varsayımınız doğru. Bununla birlikte, 5.10.1 ile başlayarak, uygun bayraklar PERL_UNICODE ortam değişkeni veya başka bir mekanizma aracılığıyla etkinleştirilirse, olamaz.
  • Sizin dördüncü varsayım değil genellikle doğru. Perl yorumlayıcısını betik ile argüman olarak çağırmaktan ziyade, betiğin doğrudan çağrılması durumunda durumdan bahsediyorsunuzdur. İki genel durum var.
    • İşletim sisteminin, ".pl" uzantısına sahip herhangi bir dosyanın, Windows gibi yürütme için perl yorumcısına iletileceğini belirlediği bir sistemde, doğru olabilirsiniz.Ancak betiğin -CSDA olmadan çağrıldığında betimlenmesi, standart girdi ve @ARGV'nin betiğin beklediği gibi UTF-8 olmadığı için gizemli bir şekilde başarısız olan şeylerden ziyade istenen davranış olduğu iddia edilebilir.
    • Çoğu * nix kabukları gibi bir komut doğrudan yürütüldüğünde shebang çizgisini okuyan bir sistemde, shebang satırında belirtilen komut satırı seçenekleri yorumlayıcıyı çağırırken ve bu nedenle shebang satırında -CSDA kullanılır onurlandırılacaktır.
+1

+1. Son öğe için, '/ usr/bin/perl' 'nin tercüman olmadığı sistemlerde,' perl '' in hangi versiyonunu çağırdığına karar veren bir programdır (örneğin, 5.8' ve 5.10’un OS X sistemlerinde olduğu gibi) co-var), shebang satırında -CSDA', sonunda çağrıldığında, perl’in çoğalmasına neden olur. –

+0

Bu doğruysa, sarmalayıcı komut dosyasında bir hata olur. Ama bir Mac üzerinde kontrol ettiğimde, sorunun aslında 5.10.0'ın (OS X 10.6.6 ile birlikte geliyor) -C'nin her zaman izin vermediğini, 5.10.1'in (Linux makinemde sahip olduğum şey) olduğunu gördüm. Belirtilen bayraklar zaten aktif ise izin verir. Shebang üzerinde perl5.8.9 belirtilmesi doğru -CSDA onur duyar. – Anomie

+0

Açıklama için teşekkür ederiz. Çok takdir edildi. –

3

senaryonuz

#!/usr/bin/perl -CSDA 

ve aşağıdaki gibi Perl başlatacak

./script foo 

OS kullanarak komut başlatırsanız:

/usr/bin/perl -CSDA ./script foo 

değişiklik içinde Böyle düzeltme -CSDA kaldırmak için değil

/usr/bin/perl ./script foo 

kullanılması gibi yanlış senaryoyu başlatmak davranış, yalnızca devreye girer, düzeltme doğru senaryoyu aramak.

+0

Bağlıdır. -CSDA'nın anlamaya çalıştığım bu programın işleyişi üzerinde herhangi bir etkisi olup olmadığını anlamaya çalışıyorum. –

+0

@Sinan Ünür, STDOUT veya STDERR yazdı mı? STDIN'den okuyor musunuz? Daha sonra ASCII aralığının dışında bir şeyle uğraşmayı düşünüyorsanız, bunu ya da eşdeğer bir şey kullanıyor olmalısınız. – ikegami

+0

Evet, bilmiyorum, bu sorunun bir parçası. –