Это действительно не работа с многомерными массивами, если бы вы работали с такими вещами, как:
my @foo = (
[1,2,3],
[4,7,8,1,2,3],
[2,3],
);
Это действительно очень простой способ сделать вложенный цикл, который повторяется по одному и тому же массиву. Держу пари, это домашнее задание.
Итак, я позволю вам разобраться во вложенности, но немного помогу с операторами цикла Perl.
!! для / Еогеасп
for
(каждый из них необязательный) - настоящий сильный удар по циклу в perl Используйте это так:
for my $var ( @array ) {
#do stuff with $var
}
Каждый элемент в @array
будет связан с переменной $var
, и будет выполнен блок кода. Тот факт, что мы используем псевдонимы, а не копирование, означает, что если изменить значение $var
, то будет изменено и @array
. В скобках может быть любое выражение. Выражение будет оцениваться в контексте списка . Таким образом, если вы поместите дескриптор файла в паренсы, весь файл будет считан в память и обработан .
Вы также можете оставить имя переменной цикла, вместо нее будет использоваться $_
. В общем, НЕ ДЕЛАЙТЕ ЭТОГО.
!! C-Style для
Время от времени вам нужно следить за индексами, когда вы зацикливаетесь на массиве. Это когда C стиль для цикла пригодится.
for( my $i=0; $i<@array; $i++ ) {
# do stuff with $array[$i]
}
!! Пока / До
В то время как и пока работают с условиями логического цикла. Это означает, что цикл будет повторяться до тех пор, пока соответствующее логическое значение будет найдено для условия (TRUE для while
и FALSE для until
). В дополнение к очевидным случаям, когда вы ищете определенное условие, while
отлично подходит для обработки файла по одной строке за раз.
while ( my $line = <$fh> ) {
# Do stuff with $line.
}
!! карта
map
- удивительно полезная часть функционального программирования кунг-фу. Он используется для превращения одного списка в другой. Вы передаете анонимную ссылку на код, которая используется для преобразования.
# Multiply all elements of @old by two and store them in @new.
my @new = map { $_ * 2 } @old;
Так как вы решаете свою конкретную проблему? Есть много способов. Что лучше, зависит от того, как вы хотите использовать результаты. Если вы хотите создать новый массив пар букв, используйте map
. Если вы заинтересованы в первую очередь побочным эффектом (скажем, печать переменной), используйте для. Если вам нужно работать с действительно большими списками, которые происходят из своего рода интегратора (например, строки из дескриптора файла), используйте while
.
Вот решение. Я не передам это твоему профессору, пока ты не поймешь, как это работает.
print map { my $letter=$_; map "$letter$_\n", "a".."z" } "a".."z";
Посмотрите статьи perldoc, perlsyn для получения информации о циклических конструкциях, perlfunc для получения информации о map
и посмотрите perlop для получения информации об операторе диапазона (..
).
Удачи.