Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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 设置文件句柄,以便悄悄跳过对其的打印?_Perl_Filehandle - Fatal编程技术网

Perl 设置文件句柄,以便悄悄跳过对其的打印?

Perl 设置文件句柄,以便悄悄跳过对其的打印?,perl,filehandle,Perl,Filehandle,这种奇怪的兴趣来自于不断扩展的需求,而没有时间改变设计(重构)。当然,这不是一个好的设计,但我现在需要处理它,希望以后重构 早期打开的一些日志文件会打印到整个代码中。新的要求意味着,如果使用(新的)命令行选项(--noflag),其中一个日志文件是不相关的 目前我所能做的就是将定义(打开我的$fh,)和它的所有用法(打印$fh…)添加到如果$flag)。这显然是一个糟糕的设计,而且容易出错(也不太好) 当$fh与文件关联时,是否有方法使用它执行某些操作 因此,intepreter接受以下任何pr

这种奇怪的兴趣来自于不断扩展的需求,而没有时间改变设计(重构)。当然,这不是一个好的设计,但我现在需要处理它,希望以后重构

早期打开的一些日志文件会打印到整个代码中。新的要求意味着,如果使用(新的)命令行选项(
--noflag
),其中一个日志文件是不相关的

目前我所能做的就是将定义(
打开我的$fh,
)和它的所有用法(
打印$fh…
)添加到
如果$flag
)。这显然是一个糟糕的设计,而且容易出错(也不太好)

$fh
与文件关联时,是否有方法使用它执行某些操作 因此,intepreter接受以下任何
print$fh…
,但只会导致不运行
print
,而不会出错?(让我想象一下,比如,
$fh=VOID if$flag;
)或者,是否存在一些
NULL
流之类的东西?我所知道的只有标准代码(1)、
STDERR
(2)和标准代码(0)

我不希望
$fh
打印到其他任何地方,理想情况下甚至不希望打印到
/dev/null
(如果可能的话)。我环顾四周,没有找到任何相关的东西。如果事实上这些信息已经存在的话,我会很感激被指给我看。 欢迎提出任何意见

注:第一个问题(在使用SO多年后)在这里提出,请让我知道它是否关闭


更新

感谢您的回复。他们提示我添加/完善这个问题:打印标记为转到
/dev/null
是否可能优化,以便“打印”实际上不会发生?(尽管我仍然对是否可以设置文件句柄来告诉Perl“不要在这里打印”感兴趣。)

我试图避免运行void(print)语句,而不添加条件


更新/澄清


从评论中总结一下(谢谢!):这不是对性能优化的追求。我完全同意评论中所说的一切。只是执行毫无意义的语句(通常在一百万左右)让我感到不安。此外,我还对Perl的一些可能的黑暗角落感到好奇,因为我还没有遇到过。(大部分问题已在回答/评论中提到。)

如果您使用的是unix操作系统,则可以使用“/dev/null”

open my $fh, '>', '/dev/null' or die 'This should never happen';
Dev null将静默地接受所有输入。

您可以这样使用(大约是perldoc页面的四分之一)

下面是一些不同使用--flag选项的运行

User@Ubuntu:~$ ls -l log.txt
ls: cannot access log.txt: No such file or directory
User@Ubuntu:~$ ./nf.pl
Intitial need_log: 2
After option processing, need_log: 2
User@Ubuntu:~$ cat log.txt
Hello World... NOT
User@Ubuntu:~$ rm log.txt
User@Ubuntu:~$
User@Ubuntu:~$
User@Ubuntu:~$ ./nf.pl --flag
Intitial need_log: 2
After option processing, need_log: 1
User@Ubuntu:~$ cat log.txt
Hello World... NOT
User@Ubuntu:~$ rm log.txt
User@Ubuntu:~$
User@Ubuntu:~$
User@Ubuntu:~$ ./nf.pl --noflag
Intitial need_log: 2
After option processing, need_log: 0
User@Ubuntu:~$ cat log.txt
cat: log.txt: No such file or directory
User@Ubuntu:~$
我已经将
$needu_log
变量初始化为'2',这样我们就可以知道它是否由于存在
标志
选项而具有“True”值(在这种情况下,它将具有值1),或者根本没有提及标志选项而具有“True”值(在这种情况下,其值为2


指定'--noflag'将触发else子句,该子句将'unde'作为创建匿名临时文件的第三个参数。这与您根本不写的问题并不完全匹配,但是如果文件是临时文件,并且您没有在其中放入千兆字节,则这将有望满足您的要求。

gic,你可以创造一个神奇的手柄,操作总是成功的

perl -e'
   {
      package Handle::Dummy;
      use Tie::Handle qw( );
      use Symbol qw( gensym );
      our @ISA = qw( Tie::Handle );
      sub new { my $fh = gensym; tie *$fh, $_[0]; $fh }
      sub TIEHANDLE { bless(\my $dummy, $_[0]) }
      sub READ  { return 1; }
      sub WRITE { return 1; }
      sub CLOSE { return 1; }
   }

   my $fh = Handle::Dummy->new();   
   print($fh "abc\n") or die $!;
   close($fh) or die $!;
   print("ok\n");
'
ok
这避免了系统调用,但用昂贵的Perl子例程调用代替了系统调用

简单地使用
/dev/null
更简单、更可靠[1],速度也会更快


打印标记为转到
/dev/null
是否可能已优化

不知道。Perl对
/dev/null
一无所知

你认为系统调用有多慢?这听起来不适合优化


  • 神奇的文件句柄与系统文件句柄没有关联,因此无法将其传递到C库,它将无法生存
    exec
    ,等等

  • 关闭文件句柄

    close $fh;
    
    将使您对该文件句柄的所有
    打印失败。运行

    no warnings 'closed';
    

    要抑制将生成的所有警告消息(您确实使用了警告,对吗?)

    好的,谢谢。如果可能的话,我宁愿不打印。据我所知,打印到
    /dev/null
    仍然可以,如果可能的话,我宁愿不打印所有这些打印。但这是下一个最好的方法。@zdim:不要想它。除非你已经分析了你的代码并优化了最严重的瓶颈,否则可能会有更糟糕的情况你不知道的暴行。这只是过早的优化为什么/dev/null不够好?打印本身的执行成本太高吗?然后你需要在代码中加入一个条件。目标文件句柄无法阻止打印的发生(不过你可能会重新定义打印…)@好吧,这已经足够好了。执行成本不会有任何影响。但原则上我不希望执行void语句。此外,我真的很好奇是否可以将文件句柄设置为会告诉Perl“请勿在此处打印”的内容。@zdim:If
    /dev/null
    是“足够好”且“执行成本不会有任何影响”然后你就有了答案。如果你正在创建一个临时的黑客来完成任务,那么你就不能对执行“无效语句”太挑剔了。打开你的文件句柄到
    /dev/null
    。这正是你打算用文件句柄“print$fh do\u something\u昂贵的()总是会运行dou_some_昂贵的()。@Borodin是的,这是一个很好的观点。我们希望会有一些与Perl交流的隐藏渠道(嘘,不要在这里打印)。这是一个很好的观点,
    /dev/null
    就是为了这个,这是一个黑客行为。这是一个错误的方向,因为它不仅涉及
    no warnings 'closed';