【问题标题】:Perl set file handle based on command line argsPerl 根据命令行参数设置文件句柄
【发布时间】:2012-02-20 02:52:26
【问题描述】:

如果数据通过管道输入或提供了文件,我想从默认输入中读取,但如果没有给出任何内容,我想为while(<>) 提供一个默认值以执行。

伪代码:

if(!<>){
  <> = system("ls | ./example.pl");
}

while(<>){
...
...
...
}

【问题讨论】:

  • 实施中的哪一部分让您感到困惑?
  • 这似乎无效。我想设置。此外,测试 (if(!&lt;&gt;)) 似乎也不正确。
  • @Chris 对,这些都不明智。 &lt;&gt; 是一个从文件中读取的操作符。您无法设置它,并且执行 if(!&lt;&gt;) 从某处读取一行并测试 该行 是真还是假。
  • @hobbs 因此出现“伪代码”提示。我知道这是不正确的,我想问如何做同样的事情

标签: perl unix command-line stdin filehandler


【解决方案1】:

您的“如果输入数据”会使事情变得困难。说起来容易

if (!@ARGV) {
    @ARGV = ("somedefault");
}

while (<>) {
    ...
}

如果命令行上没有给出文件名,它将在“somedefault”上运行——但这意味着如果命令行上没有任何文件名,你将永远不会获得从标准输入读取的 Perl 默认值。

一种可能的折衷方案是使用-t operator 来猜测标准输入是否是终端:

if (!@ARGV && -t STDIN) {
    @ARGV = ("somedefault");
}

如果命令行上没有文件名,它将使用“somedefault”并且标准输入连接到终端,但如果没有文件名并且标准输入从文件重定向,它将使用标准输入或管道。这有点神奇(也许很烦人),但可以满足您的要求。

【讨论】:

  • 当我尝试这样做时,用system("ls") 替换(some default) 终端将永远运行。我管错了吗?我也尝试过“ls | ./ctime”,但这似乎是无限递归的。
  • 这些都不合理。 "ls|" 可能有意义。
【解决方案2】:

尝试从&lt;&gt; 读取数据,如果没有读取任何内容,然后回退到默认设置怎么样?

while (my $line = <>)
{
     do_stuff($line);
}

# if no lines were read, fall back to default data source
if (not $.)
{
     while (my $line = <SOMETHING_ELSE>)
     {
          do_stuff($line);
     }
}

您可以阅读有关$. 变量here, at perldoc perlop 的信息 - 它表示最近读取的文件句柄的“当前”行号。如果未定义,则 &lt;&gt; 没有可读取的内容。

【讨论】:

    猜你喜欢
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2020-01-23
    • 1970-01-01
    • 2015-04-13
    • 2012-08-14
    相关资源
    最近更新 更多