Python betiğimi Perl ile çalıştırdığımda neden herhangi bir sözdizimi hatası almıyorum?


85

İçine biraz test python kodu yazdım test.pyve şu şekilde başlatıyorum:

perl test.py

Bir süre sonra hatamı anladım. "Bir süre sonra" diyorum, çünkü Python kodu, Python yorumlayıcısında olduğu gibi gerçekten doğru şekilde çalıştırılır!

Perl'im Python'umu neden yorumluyor? test.pybuna benzer:

#!/usr/bin/python

...Python code here...

İlginç bir şekilde, tersini yaparsam (yani çağırırsam python something.pl) çok sayıda sözdizimi hatası alıyorum.


6
Sanırım #!dosyanın başındaki yüzünden . Gerçekten de, eğer o-patlamayı kaldırırsam, beklenen davranışı elde ederim. Zaten güvenlik açısından da kötü bir fikir değil mi?
Dacav

8
Hayır. Shebang yolunun noktası bir yorumlayıcı belirtmektir. Çalıştırmak için koda güvenmiyorsanız, ilk başta çalıştırmamalısınız.
Sobrique

1
Hayır gerçek değil. Komut dosyanız bir metin dosyasıdır. Ne fazla ne az. Tercüman olmadan 'çalışmaz'.
Sobrique

4
"Perl'im Python'umu neden yorumluyor?" "artık yeniden üretilemeyen bir sorun veya basit bir yazım hatası" değildir. Yeniden açılması için oy verildi. Q ve A şovundaki olumlu oylar, bu popüler bir ilgi meselesidir.
ikegami

1
@ikegami Popülerliğine bakılmaksızın, bu açıkça "basit bir yazım hatası değil ... gelecekteki okuyuculara yardımcı olma ihtimali olmayan bir şekilde çözüldü." Yeniden açılması için oy verildi.
ThisSuitIsBlackNot

Yanıtlar:


114

Gönderen perlrun ,

Eğer #!hat kelime "perl" ne de kelime adını "indir" programı içermiyor #!yerine Perl tercüman yürütülür. Bu biraz tuhaf, ancak bunu yapmayan makinelerdeki insanlara yardımcı olur #!, çünkü bir programa SHELL'lerinin / usr / bin / perl olduğunu söyleyebilirler ve Perl daha sonra programı onlar için doğru yorumlayıcıya gönderir.

Örneğin,

$ cat a
#!/bin/cat
meow

$ perl a
#!/bin/cat
meow

32
Vay. Belirsiz özelliklerinizden bahsedin. Perl'i 20 yıldan fazla bir süredir kullanıyorum ve bunu yaptığı hakkında hiçbir fikrim yoktu.
cjm

4
DOS, VMS ve Solaris üzerinde Perl v4 kullanmaya başladım. Bunun gibi işletim sisteminden bağımsız / köprüleme özellikleri, platformlar arası yaşamı çok daha kolay hale getirdi.
tjd

1
@MarcvanLeeuwen Linux, OSX, VAX / VMS, Windows, Solaris, OS / 2 için programlar yazdığınızda ve bir betik dili programını taşımanın en sinir bozucu kısmı, bu sistemlerin çoğu gibi, onu başlatmaktır. ortak olarak "bir komut yazın, bulup çalıştırmasını sağlayın" özelliğini paylaşmak, neredeyse her şeyi farklı şekilde yapmak. Bu Perl özelliği, Perl'i işlevsellik açısından kolay bir boşluk köprüsü yapar - sadece Unix tarzı bir shebang yazabilirsiniz ve Perl varsa, Perl kodu olsun ya da olmasın kod her zaman çalışır - bu daha evrenseldir #! /usr/bin/env foo.
zxq9

1
@immibis Perl5-porters e-posta listesindeki gizemi ayrıştıran Shebang satırından : " indirdiğer programları dolaylı olarak yürütmek için tasarlanmış bir programdı. çok yardımcı oluyorsunuz ve / veya belki de işletim sistemi çekirdeğinin sizi 32 karakter komut satırıyla sınırladığı durumlarda. "
ThisSuitIsBlackNot

2
Bu sadece Perl'in programlama dillerinin mutfak lavabosu olarak ününü pekiştiriyor. İlginç bir gözlem olarak, shebang'ın orijinal uygulamasının bir kabuk özelliği olduğuna inanıyorum, ancak daha sonra Unix çekirdeğine taşındı. Perl birçok kabuk mekanizması içerir (örn. Komut çıktısının yerine geri işaretler), bu sadece bir tanesidir.
Barmar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.