带有perl循环的简单多维数组

时间:2011-04-25 17:15:17

标签: perl

我正在尝试使用数组和循环来打印以下内容(基本上对于字母表中的每个字母,在其后打印字母表的每个字母,然后转到下一个字母)。我是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 个答案:

答案 0 :(得分:5)

使用范围运算符和您要定位的范围:

use strict;
use warnings;

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

你可以利用最初的2个字母,直到你想要的结尾2个字母结束,而for会照顾一切。

答案 1 :(得分:2)

这真的不是多维数组工作,如果你正在使用像:

这样的东西
my @foo = (
    [1,2,3],
    [4,7,8,1,2,3],
    [2,3],
);

这实际上是一个非常基础的如何创建一个迭代同一个数组的嵌套循环。我敢打赌这是家庭作业。

所以,我会让你弄清楚嵌套位,但是给Perl的循环运算符一些帮助。

!!为/的foreach

for(每个都是可选的)是在perl中循环的真正重击手。像这样使用它:

for my $var ( @array ) {  
    #do stuff with $var
}

@array中的每个元素都将别名为$var变量,并且将执行代码块。我们是别名而不是复制这一事实意味着如果改变$var的值,@array也将被更改。括号之间的东西可能是任何表达式。表达式将在列表上下文中进行评估。因此,如果您将文件句柄放在parens中,整个文件将被读入内存并进行处理

您也可以不使用命名循环变量,而是使用$_。一般来说,不要这样做。

!!

的C风格

每隔一段时间,您需要在循环数组时跟踪索引。这是一个C风格的循环派上用场。

for( my $i=0; $i<@array; $i++ ) {
   # do stuff with $array[$i]
}

!!虽然/直到

while和until使用布尔循环条件。这意味着如果为条件找到适当的布尔值,循环将重复(while为TRUE,until为FALSE)。除了您正在寻找特定条件的明显情况之外,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获取有关范围运算符(..)的信息。

祝你好运。

答案 2 :(得分:1)

使用range operator..)进行初始化。范围运算符基本上可以获取一系列值,例如数字或字符。

然后使用嵌套循环遍历数组,每个字符一次,总共26 ^ 2次迭代。

我使用foreach循环来遍历数组中的每个项目,而不是while循环。您也可以将'a' .. 'z'而不是声明@arr作为foreach循环的参数。下面的foreach循环依次将$char$char2设置为@arr中的每个值。

my @arr = ('a' .. 'z');
for my $char (@arr) {
    for my $char2 (@arr) {
        print "$char$char2\n";
    }
}

答案 3 :(得分:0)

如果您真正想要的是打印您描述的676个字符串,那么:

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

my $str = 'aa';

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

但我闻到了“XY问题”......