在循环中不能从数字中生成数组

时间:2016-02-12 08:33:23

标签: perl

我的数组有问题。我正在尝试从@mas3创建新数组,问题在于@mas6我的程序不会向数组添加任何低于10的数字。但正如您所看到的,数组@mas3中的数字少于10。

#!/usr/bin/perl

$eilute1 = "Sveiki man yra 10 metu as buvau gimtadienyje pries 2 metus";
$eilute2 = "Sveiki man sueis 15 metu o kazkada buvo tik 5";

print "$eilute1";
print "$eilute2";
print "\n";
@mas1=split(" ",$eilute1);
@mas2=split(" ",$eilute2);
print "Pirmas masyvas\n@mas1\nAntras masyvas\n@mas2\n";
print "\n";
print "Pirmas naujas masyvas\n";
my @mas3=(@mas1,@mas2);
print "@mas3\n";
my $i=0;
my $x=scalar(@mas3);
while($i < $x){

my $reiksme=@mas3[$i];

if(length($reiksme) > 4) { my @mas4=push(@mas4,$reiksme); }
elsif(length($reiksme) <= 4) { my @mas5=push(@mas5,$reiksme); }
elsif($reiksme < 10) { my @mas6=push(@mas6,$reiksme); }
else { print " ## Error ##\n" } ;
$i++;
}
print "\n";
print "@mas4\n";
print "@mas5\n";
print "@mas6\n";

2 个答案:

答案 0 :(得分:0)

所有项目都放入@mas4@mas5数组,因为始终满足第一个或第二个条件,因此无法达到任何else块:

if(length($reiksme) > 4) { my @mas4=push(@mas4,$reiksme); }
elsif(length($reiksme) <= 4) { my @mas5=push(@mas5,$reiksme); }

对于它们没有任何其他条件,变量大于4或小于或等于4.

此外,对于$reiksme < 10您可能会错过length()周围的$reiksme

最后但并非最不重要 - 您不需要将推送结果分配给其他变量,您修改的原始变量将被修改。

答案 1 :(得分:0)

我稍稍整理了你的程序,以便我可以正确地看到块的开始和结束位置。我还添加了use strictuse warnings,这是必不可少的,正如有人评论的那样。

正如Zbynek写的那样,每个单词要么长于四个字符,要么四个字符和更短,所以前两个条件中的一个总是会成功,第三个条件永远不会被测试。

测试字符串是否包含数字的最简单方法是使用正则表达式。我使用了$reiksme =~ /\d/ and length $reiksme == 1,其中正则表达式/\d/测试字符串是否包含数字,如果它只有一个字符长,那么它必须是0到9.我&#39 ; ve也将测试移到了开头,以便它不会被其他两个测试覆盖

#!/usr/bin/perl

use strict;
use warnings;

my $eilute1 = "Sveiki man yra 10 metu as buvau gimtadienyje pries 2 metus";
my $eilute2 = "Sveiki man sueis 15 metu o kazkada buvo tik 5";

print "$eilute1\n";
print "$eilute2\n";
print "\n";

my @mas1 = split ' ', $eilute1;
my @mas2 = split ' ', $eilute2;

print "Pirmas masyvas\n@mas1\nAntras masyvas\n@mas2\n";
print "\n";
print "Pirmas naujas masyvas\n";

my @mas3 = ( @mas1, @mas2 );
print "@mas3\n";

my (@mas4, @mas5, @mas6);

for my $reiksme ( @mas3 ) {

    if ( $reiksme =~ /\d/ and length $reiksme == 1   ) {
        push @mas6, $reiksme;
    }
    elsif ( length($reiksme) > 4 ) {
        push @mas4, $reiksme;
    }
    elsif ( length($reiksme) <= 4 ) {
        push @mas5, $reiksme;
    }
    else {
        print " ## Error ##\n";
    }
}

print "\n";

print "4 - @mas4\n\n";
print "5 - @mas5\n\n";
print "6 - @mas6\n\n";

输出

Sveiki man yra 10 metu as buvau gimtadienyje pries 2 metus
Sveiki man sueis 15 metu o kazkada buvo tik 5

Pirmas masyvas
Sveiki man yra 10 metu as buvau gimtadienyje pries 2 metus
Antras masyvas
Sveiki man sueis 15 metu o kazkada buvo tik 5

Pirmas naujas masyvas
Sveiki man yra 10 metu as buvau gimtadienyje pries 2 metus Sveiki man sueis 15 metu o kazkada buvo tik 5

4 - Sveiki buvau gimtadienyje pries metus Sveiki sueis kazkada

5 - man yra 10 metu as man 15 metu o buvo tik

6 - 2 5