如何通过if条件对foreach中的值进行分组?

时间:2014-11-13 03:25:28

标签: perl

我的剧本就像这样

use warnings;
use strict;
my @ar = <DATA>;
for(my $i = 0; $i<=$#ar; $i++){
    $ar[$i] =~m/(\d+)$/g;
    print "$ar[$i]\n" if ($& <= 15);
    print "$ar[$i]\n" if ($& >100);
    print "$ar[$i]\n" if ($& <40 && $& > 15); 
}
__DATA__
hinsa 121
mkzin 12
mkva 34
mvakine 2
mzkev  9
mkvvz 5
mkhvzz 35

它给出了输出,但它不是按条件对值进行分组。我也试试这个

@ar = <DATA>;
for(my $i = 0; $i<=$#ar; $i++){
    $ar[$i] =~m/(\d+)$/g;
    print "$ar[$i]\n" if ($& <= 15);
}
for(my $v = 0; $v<=$#ar; $v++){
    $ar[$v] =~m/(\d+)$/g;
    print "$ar[$v]\n" if ($& >100);
}
for(my $z = 0; $z<=$#ar; $z++){
    $ar[$z] =~m/(\d+)$/g;
    print "$ar[$z]\n" if ($& <40 && $& > 15); 
}

在此代码中,条件的第二个不起作用。 它给出了输出:

mkzin 12
mvakine 2
mzkev  9
mkvvz 5

mkva 34
mkhvzz 35

我希望输出

mkzin 12
mvakine 2
mzkev  9
mkvvz 5
hisa 121
mkva 34
mkhvzz 35

我该怎么办? 还请解释一下,在我的剧本2中为什么第二个foreach条件不起作用?

2 个答案:

答案 0 :(得分:0)

@Hussain:编写perl代码时,请确保使用use strict;use warnings;。我修改了你的perl代码,你的代码问题是你试图比较未初始化的$& value with a number。所以它会在某某时候发出警告use of uninitialized $& in numeric gt (>)。为此,我已使用标量变量进行了修改,如下所示:

输入文件(test.txt):

hinsa 121
mkzin 12
mkva 34
mvakine 2
mzkev  9
mkvvz 5
mkhvzz 35

<强>代码:

    use strict;
    use warnings;

    #Pass test.txt as an argument to the program
    my $file = $ARGV[0];
    open (my $fh, "<", $file) || die "cant open file";

    my @ar = <$fh>;

   for(my $i = 0; $i<=$#ar; $i++){
          my $temp = 0;
         ($temp) = $ar[$i] =~ m/(\d+)/g;
          print "$ar[$i]\n" if ($temp <= 15);        
        }   

   for(my $v = 0; $v<=$#ar; $v++){
           my $temp = 0;
          ($temp) = $ar[$v] =~ m/(\d+)/g;
          print "$ar[$v]\n" if ($temp > 100);
       }

   for(my $z = 0; $z<=$#ar; $z++){
          my $temp = 0;
         ($temp) = $ar[$z] =~ m/(\d+)/g;
         print "$ar[$z]\n" if ($temp <40 && $temp > 15); 
       }
    close($fh);

<强>输出:

mkzin 12
mvakine 2
mzkev  9
mkvvz 5
hisa 121
mkva 34
mkhvzz 35

答案 1 :(得分:0)

不需要这样复杂的代码。

此程序的工作原理是将文件的每一行保存到数组@groups的相应元素中,并在读取文件后打印内容。

我希望您意识到价值在40到100之间的行根本不会被打印出来吗?

use strict;
use warnings;

my @groups;
while (<DATA>) {
    next unless /(\d+)/;

    my $i;

    $i = 0 if $1 <= 15;
    $i = 1 if $1 > 100;
    $i = 2 if $1 < 40 and $1 > 15;

    push @{ $groups[$i] }, $_ if defined $i;
}

for (@groups) {
   print for @$_;
   print "\n";
}

__DATA__
hinsa 121
mkzin 12
mkva 34
mvakine 2
mzkev  9
mkvvz 5
mkhvzz 35

<强>输出

mkzin 12
mvakine 2
mzkev  9
mkvvz 5

hinsa 121

mkva 34
mkhvzz 35