`$ _`变量给出不正确的输出

时间:2011-08-10 01:39:16

标签: perl

如果我这样做

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


为什么?

4 个答案:

答案 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]以获取数组的第一个元素