如何知道perl程序是否有管道输入

发布于 2024-10-03 15:22:32 字数 291 浏览 6 评论 0原文

我可以使用 <> 将管道输入循环到 Perl 程序。但是我如何确定是否有管道输入,如果没有管道输入我将使用环境变量来加载文件。我正在尝试使用:

my @lines = (<>);
if ($#lines == -1) {
    use setenv;
    open FILE, "$ENV{'ART_FILE_LIST'}" or die $!;
    @lines = <FILE>;
}

显然它不起作用,因为程序将在第一行等待

I can use <> to loop there the pipeline input to a perl program. However how can I decide whether there are pipelined input, if there is no pipelined input I will use environment variable to load a file. I am trying to use:

my @lines = (<>);
if ($#lines == -1) {
    use setenv;
    open FILE, "$ENV{'ART_FILE_LIST'}" or die $!;
    @lines = <FILE>;
}

Obviously it doesn't work, because the program will waiting at the first line

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

私藏温柔 2024-10-10 15:22:32
use 5.010_000;

use utf8;
use strict;
use autodie;
use warnings qw<  FATAL all  >;
use open     qw< :std  :utf8 >;

END {
   close(STDOUT) 
       || die "can't close stdout: $!";
}


if (@ARGV == 0 && -t STDIN) {
    # NB: This is magic open, so the envariable
    #     could hold a pipe, like 'cat -n /some/file |'
    @ARGV = $ENV{ART_FILE_LIST} 
          || die q(need $ART_FILE_LIST envariable set);
}

while (<>) {
    # blah blah blah
}
use 5.010_000;

use utf8;
use strict;
use autodie;
use warnings qw<  FATAL all  >;
use open     qw< :std  :utf8 >;

END {
   close(STDOUT) 
       || die "can't close stdout: $!";
}


if (@ARGV == 0 && -t STDIN) {
    # NB: This is magic open, so the envariable
    #     could hold a pipe, like 'cat -n /some/file |'
    @ARGV = $ENV{ART_FILE_LIST} 
          || die q(need $ART_FILE_LIST envariable set);
}

while (<>) {
    # blah blah blah
}
落花浅忆 2024-10-10 15:22:32

您可以使用 -t 运算符来查看您是否是终端,即不是管道:

if (-t STDIN) { print "Terminal\n" } 
        else { print "Not a terminal\n" }

You can use the -t operator to see if you are a terminal, i.e., not a pipeline:

if (-t STDIN) { print "Terminal\n" } 
        else { print "Not a terminal\n" }
话少心凉 2024-10-10 15:22:32

使用 Getopt::Long

perl -Mylib -e 'Mylib::do_stuff' --i_am_pipe_lined

的其中一件事UNIX 管道的特点是它们通过不关心它们之前或之后的内容来实现其有用性。他们只是有工作要做,而且他们也这么做了。它们简单地做一件事,但它们都有开关来完成简单的工作,并进行更多的定制。

Use Getopt::Long

perl -Mylib -e 'Mylib::do_stuff' --i_am_pipe_lined

One of the things about UNIX pipelines is that they achieve their usefulness by not caring what's before them or after them. They just have a job to do and they do it. They do one thing, simply, but they all have switches to do their simple job with a little more customization.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文