Почему PowerShell (с Perl) удаляет двойные кавычки в простом операторе печати? - PullRequest
6 голосов
/ 09 августа 2009

Я давний пользователь Linux, но я новичок в Windows и PowerShell. Я только что установил Windows7 и Strawberry Perl 5 в первый раз. Теперь я хочу сделать простую печать из командной строки с помощью Windows PowerShell.

Похоже, Perl установлен правильно:

PS C:\Users\Me> perl -v 
This is perl, v5.10.0 built for MSWin32-x86-multi-thread Copyright
1987-2007, Larry Wall 
...

И все работает из командной строки:

PS C:\Users\Me> perl -e 'die'
Died at -e line 1.

PS C:\Users\Me> echo 'print "Hello, World\n"' | perl
Hello, World

Но когда я пытаюсь все это сделать самостоятельно, выводится предупреждение обработчика файла:

PS C:\Users\Me> perl -e 'print "Hello, World\n"'
No comma allowed after filehandle at -e line 1.

Так что похоже на удаление двойных кавычек.

PS C:\Users\Me> perl -e 'print \"Hello, World\n\"'
Hello, World

Это работает, но уродливо! Попробуем еще раз:

PS C:\Users\Me> perl -e 'print qq{Hello, World\n}'
Hello, World

Это больше нравится, но я в замешательстве.

Почему PowerShell избегает двойных кавычек в одинарных кавычках? Есть ли пользователи PowerShell?

Ответы [ 3 ]

3 голосов
/ 11 августа 2009

Я думаю, здесь есть пара проблем. Во-первых, кавычки имеют символическое значение как в powershell, так и в perl. Кавычки и экранирование работают немного в PowerShell, чем в оболочке UNIX. Проверьте man about_quoting в powershell.

Вторая проблема заключается в том, что командная строка perl ведет себя по-разному в период Windows. Любая двойная кавычка внутри командной строки, которую вы хотите передать в perl, должна быть экранирована в терминах perl как \ ". Это не относится к powershell. Это способ работы perl в Windows. Обычно у вас возникают подобные проблемы с cmd.exe.

Эти версии должны работать:

PS> & perl -e "print \`"hello, world\n\`""
hello, world
PS> $s = "print \`"hello, world\n\`""
PS> echo $s
print \"hello, world\n\"
PS> & perl -e $s
hello, world

Вы можете сделать то же самое с меньшим количеством экранирования, используя одинарные кавычки.

PS> & perl -e 'print \"hello, world\n\"'
hello, world
PS> $s = 'print \"hello, world\n\"'
PS> echo $s
print \"hello, world\n\"
PS> & perl -e $s
hello, world

Вы также можете поместить новую строку в powershell вместо передачи escape-последовательности новой строки в perl для анализа.

PS> & perl -e "print \`"hello, world`n\`""
hello, world
PS> $s = "print \`"hello, world`n\`""
PS> echo $s
print \"hello, world
\"
PS> & perl -e $s
hello, world
1 голос
/ 09 августа 2009

Интересно. Кажется, что когда вы покидаете мир powershell, он преобразует одинарную кавычку в двойную кавычку для правильной интерпретации командной оболочкой windows. (Или что-то типа того). Чтобы продемонстрировать с помощью Python (который, кажется, демонстрирует ту же проблему):

PS C:\> python -c  'print "Hi from python"'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'Hi' is not defined

, что является той же ошибкой, которую я получаю, если попытался сделать что-то похожее из командной оболочки Windows:

C:\>python -c  "print "Hi from python""
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'Hi' is not defined

Как будто powershell делает это при выполнении команды:

PS C:\> $s = 'python -c "print "Hi from python""'
PS C:\> cmd /c $s
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'Hi' is not defined
0 голосов
/ 09 августа 2009

Что произойдет, если вы запустите «неправильную» команду в cmd.exe вместо PowerShell? Я спрашиваю, потому что escape-последовательность, которая работает (\"), является Perl; в PowerShell это будет `` "`.

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