Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 寻找一个简单的切换;“写信给STDOUT”;及;“向outfile写入”;_Perl_Io - Fatal编程技术网

Perl 寻找一个简单的切换;“写信给STDOUT”;及;“向outfile写入”;

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

对于我现在正试图用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" => \$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";