perl 根据变量决定内容输出到哪个文件 5
有两个文件:file0、file1$i=0;$str="xxxxxxxxx";while($i++){$o=$i%2;openOUT,">>file$o";printOU...
有两个文件:file0、file1
$i = 0;
$str = "xxxxxxxxx";
while ($i++) {
$o = $i%2;
open OUT, ">>file$o";
print OUT "$str";
close OUT;
last if ($i>=100);
}。
能有方法,不需要在while语句里面打开文件吗?因为这样就要打开100次文件。
但其实一直打开的就是file1、file2这两个文件。
其实我这里是一个例子,实际上可能不止一个输出的文件,当这个输出的文件个数可变是,用大家给的这些方法就不方便了。
我后来想到用数组来代替文件句柄。
例如:
#!/usr/bin/perl
my @file_handle;
my $num = $ARGV[0];
for (my $i=0; $i<$num; $i++) {
open $file_handle[$i], ">file$i" || die;
}
my $j = 0;
my $i;
while (1) {
$i = $j % $num;
print $file_handle[$i] $j,"\n"; #但是这里语法有问题,即使中间加逗号也没有结果出来。请问大家知道为什么吗?
last if ($j++>=100);
}
for (my $i=0; $i<$num; $i++) {
close $file_handle[$i];
}
20160422:再研究,发现把print $file_handle[$i] $j,"\n"; 改为:print {$file_handle[$i]} $j,"\n"; 就行。 展开
$i = 0;
$str = "xxxxxxxxx";
while ($i++) {
$o = $i%2;
open OUT, ">>file$o";
print OUT "$str";
close OUT;
last if ($i>=100);
}。
能有方法,不需要在while语句里面打开文件吗?因为这样就要打开100次文件。
但其实一直打开的就是file1、file2这两个文件。
其实我这里是一个例子,实际上可能不止一个输出的文件,当这个输出的文件个数可变是,用大家给的这些方法就不方便了。
我后来想到用数组来代替文件句柄。
例如:
#!/usr/bin/perl
my @file_handle;
my $num = $ARGV[0];
for (my $i=0; $i<$num; $i++) {
open $file_handle[$i], ">file$i" || die;
}
my $j = 0;
my $i;
while (1) {
$i = $j % $num;
print $file_handle[$i] $j,"\n"; #但是这里语法有问题,即使中间加逗号也没有结果出来。请问大家知道为什么吗?
last if ($j++>=100);
}
for (my $i=0; $i<$num; $i++) {
close $file_handle[$i];
}
20160422:再研究,发现把print $file_handle[$i] $j,"\n"; 改为:print {$file_handle[$i]} $j,"\n"; 就行。 展开
5个回答
展开全部
大致可以这样
$i=0;
$str="xxxxx";
open OUT1, ">>file0";
open OUT2, ">>file1";
while ($i++) {
$o=$i%2;
if ($o=1) {print OUT1 $str;}
else {print OUT2 $str;}
last if $i>=100;
}
还有更简洁的是用eval,但是要调试多次才能成功,大意如下
while ($i++) {
$o=$i%2;
eval "print OUT$o $str";
last if $i<100;
}
$i=0;
$str="xxxxx";
open OUT1, ">>file0";
open OUT2, ">>file1";
while ($i++) {
$o=$i%2;
if ($o=1) {print OUT1 $str;}
else {print OUT2 $str;}
last if $i>=100;
}
还有更简洁的是用eval,但是要调试多次才能成功,大意如下
while ($i++) {
$o=$i%2;
eval "print OUT$o $str";
last if $i<100;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我理解楼主的意思是不要打开100次文件的动作,我的思路是在while中将print改成赋值,等while结束了再一次写入到文件,代码没有优化,只求能够表单我的意思。
#!/usr/bin/perl
use warnings;
use strict;
my $i = 0;
my $str = "xxxxxx";
my @file1 = my @file2 = ();
while ($i <= 100){
my $o = $i % 2;
if ($o == 1){
push @file1,$str;
}elsif($o == 0) {
push @file2,$str;
}
$i++;
}
my $file1 = '/tmp/file1';
open my $fh1,">>",$file1 or die "can't open file1 $!\n";
print $fh1 join "\n",@file1;
close $fh1;
my $file2 = '/tmp/file2';
open my $fh2,">>",$file2 or die "can't open file2 $!\n";
print $fh2 join "\n",@file2;
close $fh2;
__END__
#!/usr/bin/perl
use warnings;
use strict;
my $i = 0;
my $str = "xxxxxx";
my @file1 = my @file2 = ();
while ($i <= 100){
my $o = $i % 2;
if ($o == 1){
push @file1,$str;
}elsif($o == 0) {
push @file2,$str;
}
$i++;
}
my $file1 = '/tmp/file1';
open my $fh1,">>",$file1 or die "can't open file1 $!\n";
print $fh1 join "\n",@file1;
close $fh1;
my $file2 = '/tmp/file2';
open my $fh2,">>",$file2 or die "can't open file2 $!\n";
print $fh2 join "\n",@file2;
close $fh2;
__END__
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-07-02 · 知道合伙人互联网行家
关注
展开全部
open OUT0,">>file0";
open OUT1,">>file1";
$str = "xxxxxxxxx";
while ($i++) {
if($i%2){
open OUT1, ">>file$o";
print OUT1 "$str";
}else{
open OUT0, ">>file$o";
print OUT0 "$str";
}
last if ($i>=100);
}。
close OUT0
close OUT1
open OUT1,">>file1";
$str = "xxxxxxxxx";
while ($i++) {
if($i%2){
open OUT1, ">>file$o";
print OUT1 "$str";
}else{
open OUT0, ">>file$o";
print OUT0 "$str";
}
last if ($i>=100);
}。
close OUT0
close OUT1
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
直接在外面打开两个文件,然后在while里用IF,或者直接写$o=1 ? print OUT1 "$str" : print OUT2 "$str";
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
$i = 0;
$str = "xxxxxxxxx";
open fa,">file0" or die "open file0 failed\n";
open fb,">file1" or die "open file1 failed\n";
while ($i++) {
$o = $i%2;
if ($o == 0) {select f0;} else {select f1;}
print "$str";
last if ($i>=100);
}
close f0;close f1;
select STDOUT;
print "Don't forget give me money\n";
$str = "xxxxxxxxx";
open fa,">file0" or die "open file0 failed\n";
open fb,">file1" or die "open file1 failed\n";
while ($i++) {
$o = $i%2;
if ($o == 0) {select f0;} else {select f1;}
print "$str";
last if ($i>=100);
}
close f0;close f1;
select STDOUT;
print "Don't forget give me money\n";
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询