【问题标题】:Clear @ARGV before getting input from <>?在从 <> 获取输入之前清除 @ARGV?
【发布时间】:2019-07-25 06:02:51
【问题描述】:

我注意到@ARGV 的内容被定向到&lt;&gt; 命令的输入。

如果我要使用&lt;&gt; 从键盘获取输入,我应该事先清除@ARGV 吗?这是唯一的方法吗?

例如:

@ARGV = ();
$input = <>;

(我很惊讶@ARGV 会干扰&lt;&gt;。这有什么意义?)

【问题讨论】:

  • 使用IO::Prompter 进行键盘输入,这对于最终用户来说比普通的readline 更符合人体工程学。

标签: perl stdin argv


【解决方案1】:

&lt;&gt; 表示&lt;ARGV&gt;ARGV 文件句柄是指@ARGV 中列出的文件的串联。如果@ARGV 为空,它的行为就像@ARGV = ('-'),这意味着从标准输入读取。 (这很神奇。)见I/O Operators in perldoc perlopperldoc -f readline

&lt;&gt; 旨在模拟许多 unix 工具(例如 catsortwc、...)的常见行为,如果不传递参数则从标准输入读取,否则从命令行中列出的所有文件(将- 视为从标准输入读取的指令)。

如果您只想阅读 STDIN 的内容,请执行以下操作:

my $line = <STDIN>;

...或者,我的偏好:

my $line = readline STDIN;

(请注意,标准输入不一定是指键盘。您可以轻松地将其重定向到文件:yourscript.pl &lt; input.txt

【讨论】:

  • 如果&lt;&gt; 表示&lt;ARGV&gt; 为什么它将键盘输入读入变量?
  • @CJ7 它始终没有。正如答案所说,“如果不传递任何参数,则从标准输入中读取,否则从列出的所有文件中读取输入”
  • 具体来说:选择是读取@ARGV 中命名的文件还是回退到STDIN 是由ARGV 文件句柄本身做出的决定,而不是readline 运算符。
猜你喜欢
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多