0

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 代码?

4

3 回答 3

7

那是因为你在作弊。您不必将报告名称存储在变量中、选择文件句柄或关闭它,即可打印到文件...

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
于 2013-05-10T20:59:24.467 回答
3

如果您不需要恢复,则简单重定向STDOUT

my $rpt = 'report.txt';
open STDOUT, '>', $rpt or die "$0: cannot open $rpt: $!\n";
print_report($a, $b, $c);
于 2013-05-10T21:10:54.523 回答
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
于 2013-05-11T02:55:39.563 回答