переменная `$ _`, выдающая неверный вывод - PullRequest
2 голосов
/ 10 августа 2011

Если я сделаю

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 ]

13 голосов
/ 10 августа 2011

Каждый элемент в цикле помещается в $_. Когда вы говорите $answer[$_], вы запрашиваете элемент массива $answer['java'], $answer['python'] и так далее. Эти строки превращаются в 0 в числовом контексте, и, следовательно, вы получаете $answer[0], то есть java.

6 голосов
/ 10 августа 2011

Ваш первый цикл:

foreach (@answer){
    print "[$_]\n";
}

Итерирует по @answer и помещает текущий элемент массива @answer в $_ при каждом прохождении цикла.В результате вы получаете элементы @answer, напечатанные в следующем порядке.

Ваш второй цикл:

foreach (@answer) {
    print "$answer[$_]\n";
}

Выполняет ту же итерацию с теми же значениями в $_.Но, и это большое, но вы печатаете $answer[$_] и $_ - это строка каждый раз, и эта строка равна нулю в числовом контексте, поэтому вы эффективно делаете это:

print "$answer[0]\n";

четыре раза подряд.Следовательно, ваши четыре java строки.И ваш второй фрагмент выборочного вывода пропустил символы новой строки между java строками.

0 голосов
/ 10 августа 2011

То, что вы хотите сделать:

for (my $i = 0; $i < scalar(@answer); $i++)
{
    print "$answer[$i]\n";
}

или вывести $answer[0], чтобы получить первый элемент массива

0 голосов
/ 10 августа 2011

$ _ на самом деле строка в текущем индексе цикла. Это эквивалентно этому в Java:

String[] x = new String[]{ "java", "perl"...};
for (String y : x) {
...
}

$ _ будет эквивалентно y.

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