Perach Perach со строковым аргументом - PullRequest
0 голосов
/ 04 февраля 2019

Perldocs только указывает, что foreach loops "перебирает обычное значение списка" https://perldoc.perl.org/perlsyn.html#Foreach-Loops,, но я иногда вижу их со строковыми аргументами, такими как следующие примеры:

foreach (`curl example.com 2>/dev/null`) {
    # iterates 50 times
}

foreach ("foo\nbar\nbaz") {
    # iterates just 1 time. Why?
}

Isповедение передачи строки, как это определено?Отдельно, почему различие возникает в результате передачи строки, возвращаемой командой с обратным символом, и литеральной строки, как в примере?

Ответы [ 4 ]

0 голосов
/ 04 февраля 2019

Вопрос вращается вокруг контекста , критической концепции для многих вещей в Perl.

Циклу foreach требуется список для перебора, поэтому он навязывает контекст спискасоздайте список значений , которые вы видели в документах.Список может быть сформирован из литералов qw(a b c) и может содержать один элемент;это ваш второй пример, где дается одна строка, формирующая список из одного элемента, который повторяется.

Список также может быть получен из выражения, которое вычисляется в контексте списка;это твой первый пример.Многие операции дают разные результаты в зависимости от контекста, и qx является таким оператором, как объяснено в ответе моба.Это то, что нужно отметить и быть осторожным.Выражение также может возвращать одно значение независимо от контекста;тогда он просто используется для заполнения списка.

0 голосов
/ 04 февраля 2019

С perldoc -f qx:

В контексте списка возвращает список строк (однако вы определили строки с помощью $ / или $ INPUT_RECORD_SEPARATOR) или пустой список, если команда не выполнена.

С perldoc perlsyn:

Составные операторы

[...]

LABEL foreachVAR (СПИСОК) БЛОК

0 голосов
/ 04 февраля 2019

В скалярном контексте обратные метки возвращают один скаляр, содержащий все выходные данные вложенной команды.Но foreach (...) оценивает обратные пометки в контексте списка, который разделяет выходные данные в список по одной строке на элемент.

0 голосов
/ 04 февраля 2019

Строка не является списком.Если вы хотите перебрать символы в строке, вам понадобится

foreach my $character (split('', "foo\nbar\nbaz")) {

Я думаю, вы можете спутать Perl с Python:

>>> for c in "foo\nbar\nbaz":
...    print c
... 
f
o
.... remainder deleted ....
a
z
>>>

Как указано в других ответахbackticks / qx{} возвращает список строк вывода из выполненной команды в контексте списка.

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