2014-09-17 3 views
-1

Ниже приведен простой пример perl: $ _ должен находиться в диапазоне от 0 до 6, и для каждой итерации строки, содержащие соответствующее число, должны быть извлечены. Однако результат не тот, который я ожидал. Мне сказали, что $_, вероятно, нужно котировать, поэтому я использовал \Q и \E.

use strict; 
use warnings; 

for (0..6) { 
    print ("$_: ".(join ", ", (grep /\Q$_\E/, ("12", "123", "00", "0012")))."\n"); 
} 

То, что я ожидал получить:

0: 00, 0012 
1: 12, 123, 0012 
2: 12, 123, 0012 
3: 123 
4: 
5: 
6: 

То, что я на самом деле получить:

0: 12, 123, 00, 0012 
1: 12, 123, 00, 0012 
2: 12, 123, 00, 0012 
3: 12, 123, 00, 0012 
4: 12, 123, 00, 0012 
5: 12, 123, 00, 0012 
6: 12, 123, 00, 0012 

ответ

5

Вы желаете $_ быть итератором из цикла for, но это фактически устанавливается на значения справа из grep.

Ваш grep сравнивает каждое число к себе так:

grep {$_ =~ /\Q$_\E/} "12", "123", "00", "0012" 

Вы должны дать цикл for именованный итератор вместо:

use strict; 
use warnings; 

for my $num (0 .. 6) { 
    print "$num: ", join(", ", grep /\Q$num\E/, "12", "123", "00", "0012"), "\n"; 
} 

Выходы:

0: 00, 0012 
1: 12, 123, 0012 
2: 12, 123, 0012 
3: 123 
4: 
5: 
6: 
5

grep козыри скрытая переменная $_ Еогеасп; обходной путь заключается в использовании явного переменного Еогеаспа,

use strict; 
use warnings; 

for my $i (0..6) { 
    print ("$i: ".(join ", ", (grep /\Q$i\E/, ("12", "123", "00", "0012")))."\n"); 
} 

выхода

0: 00, 0012 
1: 12, 123, 0012 
2: 12, 123, 0012 
3: 123 
4: 
5: 
6: 
Смежные вопросы