代码之家  ›  专栏  ›  技术社区  ›  chappar

如何在Perl中更改系统调用的标准输出文件句柄?

  •  1
  • chappar  · 技术社区  · 17 年前

    我正在尝试使用select更改系统功能的标准输出。但它似乎不起作用。系统输出将显示在控制台上,而不是重定向到文件。

    use strict;
    use warnings;
    
    chdir "C:\\Documents and Settings\\" or die "cannot open the dir\n";
    open FH, ">out.txt" or die "cannot open out.txt\n";
    select FH or die " cannot change the stdout\n";
    system "dir /a" ; 
    

    虽然我能做到 system "dir /a > out.txt" ,我想知道为什么上面的代码不起作用。

    5 回复  |  直到 17 年前
        1
  •  3
  •   brian d foy    17 年前

    这个 select 函数更改输出的默认文件句柄。它不改变STDOUT,STDOUT指向它所指向的任何东西,而不管它是否是输出的默认文件句柄。如果你想改变标准,你必须做一些像伊莱布雷或乔恩的回答。

    启动子进程时,它将获得与父进程相同的标准输出。不过,它并不关心父级的默认文件句柄是什么。

        2
  •  2
  •   Igor    17 年前

    代码的问题是 system 命令不会为您捕获输出。你可以用 qx// :

    use strict;
    use warnings;
    
    open my $fh, ">", "output.txt" or die $!;
    my $oldfh= select $fh;
    print qx/ls -a/;
    select $oldfh;
    close $fh or warn $!;
    

    还有其他选项可以运行外部应用程序并获取读取它的输出,如 IPC::Open2 IPC::Open3 模块。默认情况下,它们包含在perl中。

    旁注:不要将globs用作文件句柄:它们是全局的,而全局的是邪恶的。改用词汇变量( FH $fh ).另外,你应该使用三个参数 open 而不是两个参数,因为前者比后者更安全。

        3
  •  1
  •   Community Mohan Dere    9 年前

    大概 this 帮助

        4
  •  1
  •   ylebre    17 年前

    use strict;
    use warnings;
    use IO::Handle;
    open FH, "> out.txt";
    STDOUT->fdopen( \*FH, 'w' ) or die $!;
    print "Hello world!\n";
    system "dir /a";
    

    希望这有帮助!

        5
  •  -2
  •   jrockway    17 年前

    我在系统(不是Perl)级别重新分配了文件描述符:

        sub reopen($$$) {
            open $_[0], $_[1]. '&='. fileno($_[2]) or die "failed to reopen: $!";
        }
    
        reopen *STDOUT,  '>', $new_stdout_handle;
    

    现在,您会认为$new\u stdout\u句柄是标准输出。

    我在gist上粘贴了一个完整的示例: http://gist.github.com/129407

    推荐文章