почему perl -e "print lc" Hello-World \ n "" печатает 0 - PullRequest
0 голосов
/ 15 октября 2018

У меня есть код, который я хочу отладить с помощью опции perl's -e из командной строки. (если быть точным, из терминала Mac OS)

Когда я вызывал такую ​​подпрограмму, я забыл правильно сопоставить двойные кавычки, вроде как:

perl -e "print lc "Hello-World\n""
#Output: 0

Я был удивлен, увидев 0, но, посмотрев ближе, увидел, что у меня возникла проблема с двойными кавычками.Неудивительно, что использование внешних одинарных кавычек решает проблему

perl -e 'print lc "Hello-World\n"'
# Output(fixed): hello-world

И теперь, когда я увидел, в чем проблема, я заинтригован, увидев, что она вернула 0 в первую очередь.Похоже, что bash выполнил какую-то операцию вычитания, потому что, если я повторю ту же ошибку, не имея там тире, у меня не возникнет этой проблемы даже с неправильными двойными кавычками:

perl -e "print lc "HelloWorld\n""
                  ^ closing the quotes too soon
#Output: helloworldn

Так почемуэто что этот синтаксис perl -e "print lc "Hello-World\n"" печатает 0?

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Есть полезный трюк, чтобы выяснить, что такое Perl «думает».

run perl -MO=Deparse -e "print lc "Hello-World\n""

perl -MO=Deparse -e "print lc "Hello-World\n""
print lc 'Hello' - 'Worldn';
-e syntax OK

Здесь происходит то, что perl "видит" Hello - Worldn как арифметическую сумму.И поскольку строки численно равны нулю, вы печатаете 0-0.Это не имеет ничего общего с bash, а скорее с perl и тем, как оно обрабатывает числовые значения.

Это потому, что голые слова приемлемы, если вы не используете strict и warnings, но приводятся к числовым значениям путем вычитания (например, 0)

Если вы включилиwarnings:

perl -Mwarnings -e "print lc "Hello-World\n""
Argument "Worldn" isn't numeric in subtraction (-) at -e line 1.
Argument "Hello" isn't numeric in subtraction (-) at -e line 1.
0 голосов
/ 15 октября 2018

Внутри одной строки я склонен использовать обобщенные кавычки , чтобы избежать этих проблем:

$ perl -e "print lc qq(Hello-World\n)"

Если двойные кавычки существуют только для новой строки, вы можете использовать *Переключатель 1006 * для добавления новой строки к каждому print (но не printf):

$ perl -le "print lc 'Hello-World'"

С помощью -E вы можете включить функции v5.10, включая say, что также добавляетновая строка для вывода:

$ perl -E "say lc 'Hello-World'"

Вы пометили это как macOS, что означает, что вы можете использовать одинарные кавычки для аргумента -e (Windows не допускает этого):

$ perl -e 'print lc qq(Hello-World\n)'
$ perl -e 'print lc "Hello-World\n"'

Внутри двойных кавычек в Unix-подобной оболочке вещи, начинающиеся с $, являются переменными.Это терпит неудачу, потому что оболочка интерполирует $HOME до того, как Perl даже увидит строку программы (это print /Users/brian).Это глупый пример, но он показывает проблему:

 $ perl -le "print $HOME"
 Unknown regexp modifier "/b" at -e line 1, at end of line
 Unknown regexp modifier "/r" at -e line 1, at end of line
-e had compilation errors.

Либо экранируйте $, либо используйте одинарные кавычки:

 $ perl -le "print \$HOME"
 $ perl -le 'print  $HOME'
0 голосов
/ 15 октября 2018

Следующее может быть полезно, чтобы увидеть код, проанализированный perl:

$ perl -MO=Deparse -e "print lc "Hello-World\n""
print lc 'Hello' - 'Worldn';

И 'Hello' и 'Worldn', преобразованные как int, равны 0.

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