有没有快速方法在Perl中重定向输出?

时间:2013-05-10 20:48:55

标签: 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代码?

3 个答案:

答案 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