请帮我简化一下这个程序 (perl的初学者)酷爱perl 100分

haokk 2002-07-20 03:21:54
这个程序用来把一个大文件分成10个小文件,大文件的格式如后,现在我写的这个程序那么多的if,elsif,我想把它给简化一下,请帮忙啊.我是初学者.
my $i=0; #count how many seq
my $n=2; #set how many seq in one file .
my $j=0; #count how many lines

#判段输入命令格式
if (-e $ARGV[0]){
open(INFILE ,"$ARGV[0]");
}else{
print " $! Useage : \n perl trim.pl filename!";
exit;
}

#得到当前格式化时间
sub sub_format_datetime
{
local($sec, $min, $hour, $day, $mon, $year) = @_[0..5];
sprintf("%4d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $day, $hour, $min, $sec);
};

#当前时间
$Time_Start = sub_format_datetime(localtime(time()));
print "Now = $Time_Start\n";
print "\n";

#计算行数和seq 的条数,并按每$n个seq放一个文件
sub count_line_seq{

while($line=<INFILE>){

if($line=~m/^>.*/){
$i++;
}
$j++;
if($i<=$n*1){
open(OUTFILE,">>trim_seq_1.seq");
print OUTFILE $line;
close(OUTFILE);
}elsif($i<=$n*2){
open(OUTFILE,">>trim_seq_2.seq");
print OUTFILE $line;
close(OUTFILE);
}elsif($i<=$n*3){
open(OUTFILE,">>trim_seq_3.seq");
print OUTFILE $line;
close(OUTFILE);
}elsif($i<=$n*4){
open(OUTFILE,">>trim_seq_4.seq");
print OUTFILE $line;
close(OUTFILE);
}elsif($i<=$n*5){
open(OUTFILE,">>trim_seq_5.seq");
print OUTFILE $line;
close(OUTFILE);
}elsif($i<=$n*6){
open(OUTFILE,">>trim_seq_6.seq");
print OUTFILE $line;
close(OUTFILE);
}elsif($i<=$n*7){
open(OUTFILE,">>trim_seq_7.seq");
print OUTFILE $line;
close(OUTFILE);
}elsif($i<=$n*8){
open(OUTFILE,">>trim_seq_8.seq");
print OUTFILE $line;
close(OUTFILE);
}elsif($i<=$n*9){
open(OUTFILE,">>trim_seq_9.seq");
print OUTFILE $line;
close(OUTFILE);
}else{
open(OUTFILE,">>trim_seq_10.seq");
print OUTFILE $line;
close(OUTFILE);
}
}
close(INFILE);
}

&count_line_seq;


#程序运行到现在的时间
$Time_End = sub_format_datetime(localtime(time()));
print "Running from [$Time_Start] to [$Time_End]\n";
print("............................................................\n");

#给出条数
print "total is $i seq. \n $j lines. ";>aesfeawfdsafds
gfdaaattt
fdsagfd
fggsgfsg
>bfdsgfhgfjytrhtr
dfsafdhgfrehgfs
fdsahgrfes
>cgdsfgfhf
dfsgfdshgfd
>retgfggf
gffggf
>rtytrhthht
gfhhd
>hgfdhgf
hggfj
>dhgfjtr
hgfdjgfjtfh
>hgfdjy
hgjuyyj
>ghjkoipoppooppo
gfghmjnxreyt
>hjtgrkjuoiuy
hfuwertbvfvjyt
>hjgtrkuoyoius
fdberwgbfd
>htgrdjytr
hgfjhgjk

...全文
34 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
haokk 2002-07-21
  • 打赏
  • 举报
回复
谢谢你的指导,经过我的少许修改和测试后可以运行.那就把分给你吧.
my $filenum = 1;

my $count_seq=0; #count how many seq
my $howmany_seq_file= 2 ; #set how many seq in one file
my $count_line=0; #count how many lines
my $this_count_seq=0; #count current seq

#判段输入命令格式
if (-e $ARGV[0]){
open(INFILE ,"$ARGV[0]");
}else{
print " $! Useage : \n perl trim.pl filename!";
exit;
}

#得到当前格式化时间
sub sub_format_datetime
{
local($sec, $min, $hour, $day, $mon, $year) = @_[0..5];
sprintf("%4d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $day, $hour, $min, $sec);
};

#当前时间
$Time_Start = sub_format_datetime(localtime(time()));
print "Time_Start = $Time_Start\n";


#计算行数和seq 的条数,并按每$n个seq放一个文件
sub count_line_seq{
open(OUTFILE, ">>trim_seq_$filenum.seq") || die "File open error!";
while($line=<INFILE>){
if($line=~m/^>.*/){
$count_seq++;
$this_count_seq++; # SEQ 计数
if ($this_count_seq > $howmany_seq_file) {
$filenum++; # 文件编号+1
$this_count_seq = 1; # 当前 SEQ 计数复位
close(OUTFILE); # 下一个 SEQ 已经开始时关闭前一个文件
open(OUTFILE, ">>trim_seq_$filenum.seq") || die "File open error!";
print "it is writing data to trim_seq_$filenum.seq ...\n";
}
}
$count_line++;
print OUTFILE $line;
$filenum = 10 if($filenum > 10);

}
close(INFILE);
close(OUTFILE);
}

&count_line_seq;


#程序运行到现在的时间
$Time_End = sub_format_datetime(localtime(time()));
print "Time_End = $Time_End \n";

#给出结果
print "It has $count_seq sequences.\nIt has $count_line lines.\n";
haokk 2002-07-20
  • 打赏
  • 举报
回复
有点问题 啊 ,那个文件后的变量自己怎麽变啊,又不在循环内.
AllCHN 2002-07-20
  • 打赏
  • 举报
回复
再精简一点,功能不变:

my $filenum = 1;

my $i=0; #count how many seq
my $n=2; #set how many seq in one file .
my $j=0; #count how many lines

#判段输入命令格式
if (-e $ARGV[0]){
open(INFILE ,"$ARGV[0]");
}else{
print " $! Useage : \n perl trim.pl filename!";
exit;
}

#得到当前格式化时间
sub sub_format_datetime
{
local($sec, $min, $hour, $day, $mon, $year) = @_[0..5];
sprintf("%4d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $day, $hour, $min, $sec);
};

#当前时间
$Time_Start = sub_format_datetime(localtime(time()));
print "Now = $Time_Start\n";
print "\n";

#计算行数和seq 的条数,并按每$n个seq放一个文件
sub count_line_seq{
my $thiscount = 0;
open(OUTFILE, ">>trim_seq_$filenum.seq") || die "File open error!";
while($line=<INFILE>){
if($line=~m/^>.*/){
$i++;
$thiscount++; # SEQ 计数
if ($thiscount >= $n) {
$filenum++; # 文件编号+1
$thiscount = 0; # SEQ 计数复位
close(OUTFILE); # 下一个 SEQ 已经开始时关闭前一个文件
open(OUTFILE, ">>trim_seq_$filenum.seq") || die "File open error!";
}
}
$j++;
print OUTFILE $line;
$filenum = 10 if($filenum > 10);
}
close(INFILE);
close(OUTFILE);
}

&count_line_seq;


#程序运行到现在的时间
$Time_End = sub_format_datetime(localtime(time()));
print "Running from [$Time_Start] to [$Time_End]\n";
print("............................................................\n");

#给出条数
print "total is $i seq. \n $j lines. ";
AllCHN 2002-07-20
  • 打赏
  • 举报
回复
改进:

my $filenum = 1;

my $i=0; #count how many seq
my $n=2; #set how many seq in one file .
my $j=0; #count how many lines

#判段输入命令格式
if (-e $ARGV[0]){
open(INFILE ,"$ARGV[0]");
}else{
print " $! Useage : \n perl trim.pl filename!";
exit;
}

#得到当前格式化时间
sub sub_format_datetime
{
local($sec, $min, $hour, $day, $mon, $year) = @_[0..5];
sprintf("%4d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $day, $hour, $min, $sec);
};

#当前时间
$Time_Start = sub_format_datetime(localtime(time()));
print "Now = $Time_Start\n";
print "\n";

#计算行数和seq 的条数,并按每$n个seq放一个文件
sub count_line_seq{
my $thiscount = 0;
open(OUTFILE, ">>trim_seq_$filenum.seq") || die "File open error!";
while($line=<INFILE>){
if($line=~m/^>.*/){
$i++;
$thiscount++;
if ($thiscount >= $n) {
$filenum++;
$thiscount = 0;
}
if ($thiscount == 0) {
close(OUTFILE) if (OUTFILE);
open(OUTFILE, ">>trim_seq_$filenum.seq") || die "File open error!";
}
}
$j++;
print OUTFILE $line;
$filenum = 10 if($filenum > 10);
}
close(INFILE);
close(OUTFILE);
}

&count_line_seq;


#程序运行到现在的时间
$Time_End = sub_format_datetime(localtime(time()));
print "Running from [$Time_Start] to [$Time_End]\n";
print("............................................................\n");

#给出条数
print "total is $i seq. \n $j lines. ";
AllCHN 2002-07-20
  • 打赏
  • 举报
回复
my $filenum = 1;

my $i=0; #count how many seq
my $n=2; #set how many seq in one file .
my $j=0; #count how many lines

#判段输入命令格式
if (-e $ARGV[0]){
open(INFILE ,"$ARGV[0]");
}else{
print " $! Useage : \n perl trim.pl filename!";
exit;
}

#得到当前格式化时间
sub sub_format_datetime
{
local($sec, $min, $hour, $day, $mon, $year) = @_[0..5];
sprintf("%4d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $day, $hour, $min, $sec);
};

#当前时间
$Time_Start = sub_format_datetime(localtime(time()));
print "Now = $Time_Start\n";
print "\n";

#计算行数和seq 的条数,并按每$n个seq放一个文件
sub count_line_seq{
my $thiscount = 0;
while($line=<INFILE>){
if ($thiscount == 0) {
close(OUTFILE) if (OUTFILE);
open(OUTFILE, ">>trim_seq_$filenum.seq") || die "File open error!";
}
if($line=~m/^>.*/){
$i++;
$thiscount++;
}
$j++;
print OUTFILE $line;
if ($thiscount >= $n) {
$filenum++;
$thiscount = 0;
}
$filenum = 10 if($filenum > 10);
}
close(INFILE);
close(OUTFILE);
}

&count_line_seq;


#程序运行到现在的时间
$Time_End = sub_format_datetime(localtime(time()));
print "Running from [$Time_Start] to [$Time_End]\n";
print("............................................................\n");

#给出条数
print "total is $i seq. \n $j lines. ";

37,722

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧