在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 代码?
在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 代码?
那是因为你在作弊。您不必将报告名称存储在变量中、选择文件句柄或关闭它,即可打印到文件...
open my $fh, '>', 'report.txt' or die "$0: cannot open $fh: $!\n";
print $fh func($a, $b, $c);
唉,如果你想重定向每个暴徒STDOUT
,请使用 shell 重定向。如果您不希望 STDOUT 默认为终端,则将其更改为默认级联到程序的位置是有意义的,
perl script_that_runs_print_report.pl > report.txt
如果您不需要恢复,则简单重定向STDOUT
my $rpt = 'report.txt';
open STDOUT, '>', $rpt or die "$0: cannot open $rpt: $!\n";
print_report($a, $b, $c);
#! /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