Простой многомерный массив с циклом в Perl - PullRequest
0 голосов
/ 25 апреля 2011

Я пытаюсь использовать массив и цикл, чтобы распечатать следующее (в основном для каждой буквы алфавита, печатать каждую букву алфавита после нее и затем переходить к следующей букве). Я новичок в Perl, у кого-нибудь есть быстрые слова:

aa
ab
ac
ad
...

ba
bb
bc
bd
...

ca
cb
...

В настоящее время у меня есть это, но он печатает только один символ алфавита ...

@arr = ("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");
$i = @arr;

while ($i)
{
 print $arr[$i];
 $i--;
}

Ответы [ 4 ]

5 голосов
/ 25 апреля 2011

Использование оператора диапазона и диапазонов, на которые вы хотите нацелиться:

use strict;
use warnings;

my @elements = ("aa" .. "zz");
for my $combo (@elements)
{
    print "$combo\n";
}

Вы можете использовать начальные 2 буквы до конечных 2 букв, которые вы хотите использовать в качестве конечных, и for позаботится обо всем.

2 голосов
/ 25 апреля 2011

Это действительно не работа с многомерными массивами, если бы вы работали с такими вещами, как:

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 для получения информации об операторе диапазона (..).

Удачи.

1 голос
/ 25 апреля 2011

Используйте оператор диапазона (..) для инициализации.Оператор диапазона в основном захватывает диапазон значений, таких как числа или символы.

Затем используйте вложенный цикл, чтобы пройти массив один раз за символ, всего 26 ^ 2 итерации.

Вместо цикла while я использовал цикл foreach для прохождения каждого элемента в массиве.Вы также можете поместить 'a' .. 'z' вместо объявленного @arr в качестве аргумента цикла foreach.Циклы foreach ниже устанавливают $char или $char2 на каждое значение в @arr по очереди.

my @arr = ('a' .. 'z');
for my $char (@arr) {
    for my $char2 (@arr) {
        print "$char$char2\n";
    }
}
0 голосов
/ 26 апреля 2011

Если все, что вы действительно хотите сделать, это напечатать 676 строк, которые вы описали, то:

#!/usr/bin/perl
use warnings;
use strict;

my $str = 'aa';

while (length $str < 3) {
    print $str++, "\n";
}

Но я чувствую запах "проблемы XY" ...

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