rand(expr)返回的是浮点数,而
int(rand(expr))返回的是整数,比如int(rand(100))返回的就是一个0-99的整数
然后说说需求,师兄有个文件,格式是两行以个记录,奇数行是序列,偶数行是序列的名字,(0,1)为第一条记录,(1,2)为第二条记录,如图所示
然后,该师哥就想从这个文件中随机抽出1000条记录,保存到一个文件,剩余的保存到另外的文件中,
我首先想到的就是rand + hash来解决这个问题,这就是我的代码,
- #sample.pl
-
#!/usr/bin/perl
-
my $in = $ARGV[0];
-
my %lns = ();# ln => 1 means get
-
die "No sampled file\n" if(!defined($in));
-
open RH,$in or die "$!";
-
my @lines = <RH>;chomp @lines;
-
close RH or die "$!";
-
my $recs = ($#lines + 1) / 2;# get the records count
-
for(my $i = 0; $i < 1000; $i++){
-
my $tln ;
-
do{
-
$tln = int(rand($recs));
-
}while($lns{"$tln"} == 1);
-
# $tln is not got yet
-
$lns{"$tln"} = 1;
-
}
-
for(keys %lns){
-
print $_,"\n";
-
}
-
open WH1,">A" or die "$!";
-
open WH2,">Left" or die "$!";
-
for($i = 0; $i < $recs ; $i ++){
-
if($lns{"$i"} == 1){
-
# print sampleOut
-
print WH1 $lines[($i - 1) * 2]."\n";
-
print WH1 $lines[($i - 1) * 2 + 1]."\n";
-
}else{
-
# print the left
-
print WH2 $lines[($i - 1) * 2]."\n";
-
print WH2 $lines[($i - 1) * 2 + 1]."\n";
-
}
-
}
-
close WH1 or die "$!";
- close WH2 or die "$!";
运行后的结果如下
文件A
尤其要注意的是文件的最后一行没有换行符,所以保险起见,应该对每行chomp,然后手动
每行print "\n",还有就是要注意 int(rand(int))才是整数