Чому я не отримую жодних синтаксичних помилок, коли я виконую свій сценарій Python за допомогою Perl?


85

Я щойно написав тестовий код python в test.py, і запускаю його наступним чином:

perl test.py

Через деякий час я зрозумів свою помилку. Я кажу "через деякий час", тому що код Python насправді виконується правильно, ніби в інтерпретаторі Python!

Чому мій Perl інтерпретує мій Python? test.pyвиглядає так:

#!/usr/bin/python

...Python code here...

Цікаво, що якщо я роблю навпаки (тобто дзвоню python something.pl), я отримую багато синтаксичних помилок.


6
Я здогадуюсь, що це через #!на початку файлу. Дійсно, якщо я прибираю вибух, я отримую очікувану поведінку. Хіба це не погана ідея з точки зору безпеки?
Dacav

7
Ні. Точка шляху до шебанга, щоб вказати перекладача. Якщо ви не довіряєте виконанню коду, тоді ви не повинні запускати його спочатку.
Sobrique

1
Ні, не дуже. Ваш сценарій - це текстовий файл. Ні більше, ні менше. Він не буде "працювати" без перекладача.
Sobrique

4
"Чому мій Perl інтерпретує мій Python?" не є "проблемою, яку більше не можна відтворити, або простою друкарською помилкою". Проголосували за відкриття. Голоси за "Q" та "A" показують, що це питання, що представляє загальний інтерес.
ikegami

1
@ikegami Незалежно від популярності, це явно не "проста друкарська помилка ... виправлена ​​таким чином, що навряд чи допоможе майбутнім читачам". Проголосували за відкриття.
ThisSuitIsBlackНе

Відповіді:


114

З Perlrun ,

Якщо #!рядок не містить ні слова "perl", ні слова "indir", програма, названа після #!, виконується замість інтерпретатора Perl. Це трохи химерно, але це допомагає людям на машинах, які цього не роблять #!, тому що вони можуть сказати програмі, що їх SHELL є / usr / bin / perl , і Perl потім надішле програму до потрібного для них інтерпретатора.

Наприклад,

$ cat a
#!/bin/cat
meow

$ perl a
#!/bin/cat
meow

32
Ого. Поговоріть про свої незрозумілі риси. Я використовую Perl більше 20 років, і я навіть не підозрював, що це робиться.
cjm

4
Я почав використовувати Perl v4 на DOS, VMS та Solaris. Саме такі агностичні / мостові функції ОС набагато спростили життя на різних платформах.
tjd

1
@MarcvanLeeuwen Коли ви пишете програми для Linux, OSX, VAX / VMS, Windows, Solaris, OS / 2 та будь-чого іншого, найнеприємнішою частиною перенесення програми на мові сценарію є її запуск, оскільки багато з цих систем, хоча зазвичай поділяючи спільну функцію "введіть команду, нехай її знайде і виконає", майже все інше робіть інакше. Ця функція Perl робить Perl простим функціональним мостом - ви можете писати лише шебанг у стилі Unix, і якщо Perl присутній, код, незалежно від того, код Perl, чи ні, завжди буде працювати - це як більш універсальний #! /usr/bin/env foo.
zxq9,

1
@immibis З потоку Shebang рядок розбору таємниць у списку розсилки perl5-porters: " indirце програма, призначена для непрямого запуску інших програм. Я пригадую, що вона повинна була бути особливо корисною в ситуаціях, коли ОС рідно не надавала вам дуже допомагає та / або, можливо, у ситуаціях, коли ядро ​​ОС обмежувало вас 32 символьними командними рядками. "
ThisSuitIsBlackНе

2
Це просто закріплює репутацію Perl як кухонної раковини мов програмування. Як цікаве спостереження, я вважаю, що оригінальна реалізація shebang була функцією оболонки, вона пізніше перейшла в ядро ​​Unix. Perl включає багато механізмів оболонки (наприклад, зворотні позначки для заміни виводу команди), це лише ще один.
Бармар,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.