如果我这样做
my @answer = qw(java python perl c);
foreach (@answer){
print "[$_]\n";
}
然后会打印
[java]
[python]
[perl]
[c]
但是,如果我在$answer
之前添加[$_]
:
my @answer = qw(java python perl c);
foreach (@answer){
print "$answer[$_]\n";
}
然后会打印
java java java java
为什么?
答案 0 :(得分:13)
循环中的每个元素都放入$_
。当您说$answer[$_]
时,您要求的是数组元素$answer['java']
,$answer['python']
,依此类推。这些字符串在数字上下文中变为0
,因此您获得的是$answer[0]
,即java
。
答案 1 :(得分:6)
你的第一个循环:
foreach (@answer){
print "[$_]\n";
}
迭代@answer
并将@answer
数组的当前元素放在$_
中,每次通过循环。结果是您按顺序打印了@answer
的元素。
你的第二个循环:
foreach (@answer) {
print "$answer[$_]\n";
}
$_
中具有相同值的相同迭代。但是,这是一个很大但是,你打印$answer[$_]
和$_
每次都是一个字符串,并且该字符串在数字上下文中为零,所以你实际上是这样做的:
print "$answer[0]\n";
连续四次。因此你的四个java
字符串。而你的第二个样本输出大部分遗漏了java
字符串之间的换行符。
答案 2 :(得分:0)
$ _实际上是循环当前索引处的字符串。它与Java中的相同:
String[] x = new String[]{ "java", "perl"...};
for (String y : x) {
...
}
$ _等同于y
。
答案 3 :(得分:0)
您想要做的是:
for (my $i = 0; $i < scalar(@answer); $i++)
{
print "$answer[$i]\n";
}
或打印$answer[0]
以获取数组的第一个元素