在 Perl 中需要6行:
my $rpt = 'report.txt';
open my $f, '>', $rpt or die "$0: cannot open $rpt: $!\n";
select $f;
print_report($a, $b, $c);
close $f;
select STDOUT;
在 Bash 中,这需要1行:
print_report $a $b $c >report.txt
有没有办法减少Perl代码?
答案 0 :(得分:7)
open my $fh, '>', 'report.txt' or die "$0: cannot open $fh: $!\n";
print $fh func($a, $b, $c);
唉,如果要重定向STDOUT
,请按mob使用shell重定向。如果您不希望STDOUT默认为终端,那么将默认值更改为程序的位置是有意义的,
perl script_that_runs_print_report.pl > report.txt
答案 1 :(得分:3)
如果您不需要恢复STDOUT
my $rpt = 'report.txt';
open STDOUT, '>', $rpt or die "$0: cannot open $rpt: $!\n";
print_report($a, $b, $c);
答案 2 :(得分:1)
#! /usr/bin/env perl
use common::sense;
sub into (&$) {
open my $f, '>', $_[1] or die "$0: cannot open $_[1]: $!";
my $old = select $f;
$_[0]->();
select $old
}
sub fake {
say 'lalala';
say for @_;
}
say 'before';
into { fake(1, 2, 3); say 4 } 'report.txt';
say 'after';
用法:
$ perl example
before
after
$ cat report.txt
lalala
1
2
3
4