Почему мой Perl однострочный не работает на Windows? - PullRequest
10 голосов
/ 19 марта 2009

Из командной строки Windows я создаю текстовый файл всех файлов в каталоге:

dir c:\logfiles /B > config.txt

Выход:

0001_832ec657.log
0002_a7c8eafc.log

Мне нужно передать файл "config.txt" в другой исполняемый файл, но перед тем, как я это сделаю, мне нужно изменить файл, добавив некоторую дополнительную информацию, необходимую для исполняемого файла. Поэтому я использую следующую команду:

perl -p -i.bak -e 's/log/log,XYZ/g' config.txt

Я ожидаю, что результат будет:

0001_832ec657.log,XYZ
0002_a7c8eafc.log,XYZ

Однако файл «config.txt» не изменяется. Используя опцию "-w", я получаю предупреждение:

Бесполезное использование константы в пустом контексте в строке -e 1.

Что я делаю не так?

Ответы [ 3 ]

32 голосов
/ 19 марта 2009

Windows cmd.exe не использует ' в качестве разделителей строк, только ". То, что вы делаете, эквивалентно:

perl -p -i.bak -e "'s/log/log,XYZ/g'" config.txt

поэтому -w жалуется "ты дал мне строку, но она ничего не делает".

Решение заключается в использовании двойных кавычек:

perl -p -i.bak -e "s/log/log,XYZ/g" config.txt

или просто опустить их, поскольку в этой команде нет метасимволов, которые были бы интерпретированы как cmd.exe.

Добавление

cmd.exe - просто очень неприятное животное, для любого, кто привык к sh подобным снарядам. Вот несколько других распространенных ошибок и обходных путей, связанных с вызовом perl.

@REM doesn't work:
perl -e"print"
@REM works:
perl -e "print"
@REM doesn't work:
perl -e "print \"Hello, world!\n\""
@REM works:
perl -e "print qq(Hello, world!\n)"
5 голосов
/ 20 марта 2009
Ответ

ephemient хорошо описывает проблему, но у вас есть другой вариант: измените вашу оболочку с cmd.exe на лучшую. Если вы человек типа Unix, то я бы посоветовал взглянуть на Cygwin , который предоставляет среду, к которой вы привыкли (например, Bash и утилиты GNU).

Если вы человек типа Windows, я бы посоветовал посмотреть PowerShell (n & eacute; e MSH n & eacute; e Monad). На самом деле, я бы посоветовал заглянуть в PowerShell, даже если вы человек типа Unix. Он интегрируется с .NET и обладает множеством полезных функций (например, объекты, которые передаются через каналы, а не простые строки текста). Если бы я застрял на ОС Microsoft, я бы использовал оболочку.

Другие оболочки для Windows, которые, похоже, нравятся людям:

0 голосов
/ 19 марта 2009

Скрипт Perl работает из оболочки Linux. Может быть, вы что-то неправильно избегаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...