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

Noo*_*obs 2 perl

如果我做

my @answer = qw(java python perl c);
foreach (@answer){
          print "[$_]\n";
}
Run Code Online (Sandbox Code Playgroud)

然后它会打印出来

[java]
[python]
[perl]
[c]
Run Code Online (Sandbox Code Playgroud)


但是,如果我$answer之前添加[$_]:

my @answer = qw(java python perl c);
foreach (@answer){
       print "$answer[$_]\n";
}
Run Code Online (Sandbox Code Playgroud)

然后它会打印出来

java java java java
Run Code Online (Sandbox Code Playgroud)


这是为什么?

fri*_*edo 13

循环中的每个元素都被放入$_.当你说$answer[$_],你要求数组元素$answer['java'],$answer['python']等等.这些字符串0在数字上下文中变成了,因此你获得的是$answer[0],即java.

  • 他们不使用警告时很糟糕,不是吗? (7认同)

mu *_*ort 6

你的第一个循环:

foreach (@answer){
    print "[$_]\n";
}
Run Code Online (Sandbox Code Playgroud)

迭代@answer并将每个@answer数组的当前元素放入$_循环中.结果是您@answer按顺序获得打印元素.

你的第二个循环:

foreach (@answer) {
    print "$answer[$_]\n";
}
Run Code Online (Sandbox Code Playgroud)

是否使用相同的值进行相同的迭代$_.但是,这是一个很大但是,你打印$answer[$_]并且$_每次都是一个字符串,并且在数字上下文中该字符串为零,所以你实际上是这样做的:

print "$answer[0]\n";
Run Code Online (Sandbox Code Playgroud)

连续四次.因此你的四个java字符串.而你的第二块样本输出遗漏了java字符串之间的换行符.