在perl中嵌套for循环

时间:2014-01-02 17:10:15

标签: perl loops nested

我正在尝试使用perl中的嵌套“for”循环创建一个小脚本。 在我学习的时候,起初我已经完成了3个循环并且运行良好。为了使事情变得更聪明,我想嵌套它们,但我不知道出了什么问题。

如果我的输入文字是ABCDEFGHI 我想获得

text 1 ABC DEF GHI
text 2 BCD EFG HI
text 3 CDE FGH I

但不是,我的输出是

text1 ABC DEF GHI ABC DEF GHI ABC DEF GHI ABC DEF GHI ABC DEF GHI ABC DEF GHI ABC DEF GHI ABC DEF GHI ABC DEF GHI
text2 BCD EFG HI BCD EFG HI BCD EFG HI
text3 CDE FGH I

这是我的脚本。我正在使用perl 5.18.1。

use Modern::Perl '2013';

my @text1;
my @text2;
my @text3;

my $entry = shift;
my $len = length $entry;

for (my $i = 2; $i < $len; $i += 3) {
    for (my $i = 1; $i < $len; $i += 3) {
        for (my $i = 0; $i < $len; $i += 3) {
            my $text = substr($entry, $i, 3);
            push @text1, uc($text);
        }
        my $text = substr($entry, $i, 3);
        push @text2, uc($text);
    }
    my $text = substr($entry, $i, 3);
    push @text3, uc($text);
}

say "text1 @text1";
say "text2 @text2";
say "text3 @text3";

我已经看过了http://perldoc.perl.org/perlsyn.html#For-Loops

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

我不知道为什么你想要三个嵌套循环(不计算substr)。你只需要两个:一个循环来确定起始位置,一个循环来完成字符串。

my $text = uc('ABCDEFGHI');
for my $offset (0..2) {
   my @parts;
   for (my $i=$offset; $i<length($text); $i+=3) {
      push @parts, substr($work, $i, 3);
   }

   say "@parts";
}

或没有substr。真正证明只有两个循环:

my $text = uc('ABCDEFGHI');
my @text = split //, $text;
for my $offset (0..2) {
   my @parts;
   for my $i ($offset..$#text) {
      $parts[ ($i - $offset) / 3 ] .= $text[$i];
   }

   say "@parts";
}

就个人而言,我会使用

my $text = uc('ABCDEFGHI');
for (1..3) {
   my @parts = $text =~ /\G.{1,3}/sg;
   say "@parts";

   $text =~ s/^.//s;
}

答案 1 :(得分:0)

您的三个循环不需要嵌套以获得所需的输出:

use Modern::Perl '2013';

my @text1;
my @text2;
my @text3;

my $entry = shift;
my $len = length $entry;

for (my $i = 0; $i < $len; $i += 3) {
   my $text = substr($entry, $i, 3);
   push @text1, uc($text);
}

for (my $i = 1; $i < $len; $i += 3) {
   my $text = substr($entry, $i, 3);
   push @text2, uc($text);
}

for (my $i = 2; $i < $len; $i += 3) {        
    my $text = substr($entry, $i, 3);
    push @text3, uc($text);
}

say "text1 @text1";
say "text2 @text2";
say "text3 @text3";

可以使用两个嵌套循环重新考虑这个因素:

use Modern::Perl '2013';

my @texts = ( [], [], [] );

my $entry = shift;
my $len = length $entry;

for ( my $start = 0; $start < 3; $start++ ) {
  for ( my $i = $start; $i < $len; $i += 3 ) {
     my $text = substr($entry, $i, 3);
     push @{$texts[$start]}, uc($text);
  }
}

for ( my $start = 0; $start < 3; $start++ ) {
  say "text${start} @{$texts[$start]}";
}

顺便说一句:如果你嵌套for循环,如果你使用另一个变量作为迭代器,它将更容易阅读和理解你的代码。您拥有的三个$i变量将起作用,但我必须检查一段时间以确保这不是您的问题。