Perl 寻找一个简单的切换;“写信给STDOUT”;及;“向outfile写入”;
对于我现在正试图用perl编写的程序,我想内置一个选项,使输出转到输出文件,这对于perl模块Getopt来说非常简单。但是,如果没有使用该选项,我希望输出转到终端(STDOUT)。为此,我编写了一个小脚本来测试是否可以使用模块IO::File构建一个交换机Perl 寻找一个简单的切换;“写信给STDOUT”;及;“向outfile写入”;,perl,io,Perl,Io,对于我现在正试图用perl编写的程序,我想内置一个选项,使输出转到输出文件,这对于perl模块Getopt来说非常简单。但是,如果没有使用该选项,我希望输出转到终端(STDOUT)。为此,我编写了一个小脚本来测试是否可以使用模块IO::File构建一个交换机 #!/usr/bin/env perl use strict; use warnings; use Getopt::Long; use IO::File; my $outfilename; GetOptions ( "out=s
#!/usr/bin/env perl
use strict;
use warnings;
use Getopt::Long;
use IO::File;
my $outfilename;
GetOptions (
"out=s" => \$outfilename,
);
my $out = IO::File->new(">$outfilename");
if (defined $out) {
print $out "Hello World!\n";
}
else {
print "Hello World!\n";
}
close $out if $outfilename;
尽管程序“运行”时有或没有-o选项,但当我在没有-o选项的情况下运行它时,perl告诉我第13行中的$outfilename没有初始化,我猜这是因为Getopt在不使用该选项时将变量返回为“false”。然而,我想不出一个办法来绕过这一点。你们能帮帮我吗?此外,我绝对相信有一种更简单的方法来构建这样一个我不知道的交换机。我写这篇文章是因为我在网上找不到更好的方法,所以如果你们有任何关于如何做得更聪明的建议,我将非常感激 您可以用文件句柄替换STDOUT,然后正常打印
if($outfilename) {
open my $of, ">", $outfilename;
*STDOUT = $of;
}
print "Hello World!\n";
您可以用文件句柄替换STDOUT,然后正常打印
if($outfilename) {
open my $of, ">", $outfilename;
*STDOUT = $of;
}
print "Hello World!\n";
您之所以会收到警告,是因为您无条件地使用了
$outfilename
作为文件名,即使它只有在提供了--out
时才有一个值
不要将整个打印
放在if
中。如果你这样做,你会得到很多重复的代码。创建一个在所有条件下都初始化的文件句柄
my $outfh;
if (defined($outfilename)) {
open($outfh, '>', $outfilename)
or die($!);
} else {
$outfh = \*STDOUT;
}
print $outfh "Hello World!\n";
或者重定向STDOUT
if (defined($outfilename)) {
open(STDOUT, '>', $outfilename)
or die($!);
}
print "Hello World!\n";
但是你为什么不从外面重定向STDOUT呢
script >script.log
您之所以会收到警告,是因为您无条件地使用了
$outfilename
作为文件名,即使它只有在提供了--out
时才有一个值
不要将整个打印
放在if
中。如果你这样做,你会得到很多重复的代码。创建一个在所有条件下都初始化的文件句柄
my $outfh;
if (defined($outfilename)) {
open($outfh, '>', $outfilename)
or die($!);
} else {
$outfh = \*STDOUT;
}
print $outfh "Hello World!\n";
或者重定向STDOUT
if (defined($outfilename)) {
open(STDOUT, '>', $outfilename)
or die($!);
}
print "Hello World!\n";
但是你为什么不从外面重定向STDOUT呢
script >script.log
可以使用设置默认输出文件句柄。这将使print
自动打印到select
ed文件句柄
if ($outfilename) {
open my $outfh, ">", $outfilename
or die "Cannot open $outfilename for output: $!";
select $outfh;
}
print "Hello world!\n";
可以使用设置默认输出文件句柄。这将使print
自动打印到select
ed文件句柄
if ($outfilename) {
open my $outfh, ">", $outfilename
or die "Cannot open $outfilename for output: $!";
select $outfh;
}
print "Hello world!\n";
您最好看一下以下内容:
select
调用允许您重新定义print
调用的默认文件处理程序。
SelectSaver
允许您在给定代码块的范围内执行相同的操作
在您的情况下,您可以重写代码,以便在运行执行输出的代码之前,根据需要创建输出文件句柄并选择它。输出代码依次调用
print
,而不使用文件句柄。您最好查看以下内容:
if ($outfilename) {
open my $outfh, ">", $outfilename
or die "Cannot open $outfilename for output: $!";
select $outfh;
}
print "Hello world!\n";
select
调用允许您重新定义print
调用的默认文件处理程序。
SelectSaver
允许您在给定代码块的范围内执行相同的操作
在您的情况下,您可以重写代码,以便在运行执行输出的代码之前,根据需要创建输出文件句柄并选择它。反过来,输出代码只需调用
print
,而无需文件句柄。或者您只需选择$of
,而无需破坏标准输出句柄。这两种解决方案(分配给*STDOUT
和选择
)在某些情况下都会中断(例如,子项的输出不会被重定向)。我的解决方案重定向fd1,因此它没有这些问题。或者您可以只选择$of,而无需破坏标准输出句柄。这两种解决方案(分配给*STDOUT
和选择
)在某些情况下都会中断(例如,子项的输出不会被重定向)。我的解决方案重定向fd1,所以它没有这些问题。或者使用select
设置输出文件句柄。@TLP,我不同意。没有迹象表明有任何必要选择select
及其带来的问题。哦……天啊,非常感谢,很高兴知道!所以IO::文件不是真的需要,或者甚至在这里“碍手碍脚”?另外,鉴于此文件仅在特定条件下打开,您将如何关闭此文件?我这样问是因为对于真正的程序,它将要创建的文件非常大,我希望尽可能地释放工作区。@mpapec,不,不,不,不比使用script>script.log更重要。如果希望函数写入文件,我建议将文件句柄传递给它(使用第一个代码段创建)。如果您必须处理现有的写得不好的函数,我建议您使用IO::Capture。@mpapec,您可以使用它或选择
,但这些不是我的建议。或者使用选择
设置输出文件句柄。@TLP,我不同意。没有迹象表明有任何必要选择select
及其带来的问题。哦……天啊,非常感谢,很高兴知道!所以IO::文件不是真的需要,或者甚至在这里“碍手碍脚”?另外,鉴于此文件仅在特定条件下打开,您将如何关闭此文件?我这样问是因为对于真正的程序,它将要创建的文件非常大,我希望尽可能地释放工作区。@mpapec,不,不,不,不比使用script>script.log更重要。如果希望函数写入文件,我建议将文件句柄传递给它(使用第一个代码段创建)。如果您必须处理现有的写得不好的函数,我建议您使用IO::Capture。@mpapec,您可以选择它或选择
,但这些不是我的建议。在某些情况下,这会中断(例如,子函数的输出不会中断)
if ($outfilename) {
open my $outfh, ">", $outfilename
or die "Cannot open $outfilename for output: $!";
select $outfh;
}
print "Hello world!\n";