我的剧本就像这样
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条件不起作用?
答案 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