Perl 'hello world' не работает при наличии строки shebang (Windows)

Я использую ActiveState Perl 5.10.1 в Windows XP.

Следующая программа выполняется, но не выводит в командной строке:

#!c:/perl/bin/perl.exe

use strict;
use warnings;

print "foo\n";

Если я удалю строку shebang, я получу «foo» в качестве вывода, как и ожидалось.

Я получаю тот же результат, если выполняю, используя только ассоциацию файлов (foo.pl), ссылаясь на perl через PATH (perl foo.pl) или даже напрямую ссылаясь на исполняемый файл perl (c:\perl\bin\perl.exe foo.pl).

Я не понимаю, почему сценарий работает без строки shebang, но я не получаю вывода, когда присутствует строка shebang. Насколько я понимаю, строка shebang не является строго необходимой для Perl в Windows, но это считается хорошей практикой, если вы хотите использовать такие переключатели, как _5 _...

Нет никакой разницы, если я явно сделаю дескриптор STDOUT, т.е. print STDOUT "foo\n";

Это сводит меня с ума; любые советы будут оценены.


person GainfulShrimp    schedule 07.06.2013    source источник
comment
70 (предположительно байтов)   -  person GainfulShrimp    schedule 07.06.2013
comment
хорошо, правильные окончания строк для Windows.   -  person ikegami    schedule 07.06.2013
comment
Я сомневаюсь, что это будет иметь значение, но можете ли вы добавить недостающую новую строку в конце и попробовать еще раз?   -  person ikegami    schedule 07.06.2013
comment
Если я сохраню сценарий как ANSI (а не UTF-8) в Notepad ++, я получу размер 67. Полагаю, это спецификация? Но для результата это не имеет никакого значения - все равно ничего при наличии шебанга. :(   -  person GainfulShrimp    schedule 07.06.2013
comment
Извините, что я просто цитирую этот вопрос - в самом файле внизу есть две новые строки.   -  person GainfulShrimp    schedule 07.06.2013
comment
хорошо, я должен был спросить об этом с самого начала. Можете ли вы предоставить следующее: perl -0777nE"say unpack 'H*', $_" foo.pl (шестнадцатеричный дамп файла).   -  person ikegami    schedule 07.06.2013
comment
Дело в том, что я видел такую ​​проблему с файлами с неправильным окончанием строк.   -  person ikegami    schedule 07.06.2013
comment
Он выводит это: 2321633a2f7065726c2f62696e2f7065726c2e6578650d0d757365207374726963743b0d757365207761726e696e67733b0d0d7072696e742022666f6f5c6e223b0d0d   -  person GainfulShrimp    schedule 07.06.2013
comment
Возможно, вы здесь что-то заметили ... повторный ввод файла в Блокноте дает другой вывод для этого шестнадцатеричного дампа: 2321633a2f7065726c2f62696e2f7065726c2e6578650a0a757365207374726963743b0a757365207761726e696e67733b0a0a7072696e742022666f6f5c6e223b0a0a   -  person GainfulShrimp    schedule 07.06.2013
comment
И файл, созданный с помощью Блокнота, дает ожидаемый результат. Теперь мне нужно выяснить, что сломано в моем Notepad ++ (у меня раньше не было этой проблемы, и я использую эту машину для Perl уже много лет!).   -  person GainfulShrimp    schedule 07.06.2013


Ответы (1)


Программа, которую я вам дал, была неправильной. Это должно было быть

perl -0777nE"BEGIN { binmode STDIN }; say unpack 'H*', $_" <foo.pl

Но проблема все же обнаружилась. Ваши строки заканчиваются символом возврата каретки (0D) вместо CRLF (0D0A)!

2321633a2f7065726c2f62696e2f7065726c2e6578650d
0d
757365207374726963743b0d
7573652‌​07761726e696e67733b0d
0d
7072696e742022666f6f5c6e223b0d
0d

Для Perl это всего одна строчка. Правильно, вся ваша программа - это очень длинная фраза.

Переключитесь с окончаний строк MacOS (машина, которая была устаревшей 10 лет назад) на окончания строк Windows, и ваша проблема должна исчезнуть.

person ikegami    schedule 07.06.2013
comment
Большое спасибо. Когда вы разместили это, я только что обнаружил, что программа работает, если я использовал Правка ›Преобразование EOL› Windows (в Блокноте ++). Понятия не имею, как я случайно переключился в режим Mac. :) - person GainfulShrimp; 07.06.2013
comment
В наши дни Mac (то есть OS / X) используют окончания строк unix (0A). Я был очень удивлен, увидев 0D! - person ikegami; 07.06.2013