perldocs文档只表明qazxsw POI循环“遍历一个正常的列表值” qazxsw POI,但我有时会看到他们与字符串参数,如下面的例子:
foreach
是指通过这样的字符串的行为?另外,为什么从例如路过一个backticked命令返回的字符串和文本字符串,因为不同的结果?
在标量上下文,反引号返回包含封闭命令的所有输出的单个标量。但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?
}
,在Perl的很多事情的关键概念。
该foreach (...)
循环需要一个列表来遍历,所以它强加列表背景下构建你看到文档中提到的context。该列表可以用文字,foreach
来形成,并且可以具有一种元素;这是你的第二个例子,其中一个字符串给出,形成被重复过的一个元素列表。
该列表还可以来自一个表达式,在列表中的上下文被评估;这是你的第一个例子。许多操作产生基于上下文的不同回报,list values是这样的暴民的答案解释的操作。这是一些需要注意和小心。表达也可以返回上下文的单个值,而不管;那么它只是用来填充列表。
从qw(a b c)
:
在列表环境中,返回线路(但是你定义线/使用$或INPUT_RECORD_SEPARATOR $)列表,或者一个空列表,如果该命令失败。
从qx
:
复合语句
[...]
LABEL的foreach VAR(LIST)BLOCK
字符串是不是列表。如果你想字符遍历字符串中的你需要
perldoc -f qx
我想你可能与Python会混淆的Perl:
perldoc perlsyn
如由其他的答案反引号指出/ foreach my $character (split('', "foo\nbar\nbaz")) {
从被执行的命令在列表上下文返回的输出线的列表。