我想编写 perl 脚本,它可以读取在调用脚本时给出的 STDIN,读完它,然后以交互方式提示用户输入一行 STDIN。这一单行 STDIN 将告诉脚本如何继续。
在实际应用中,我希望脚本创建一个临时文件,报告临时文件的大小,然后询问用户是否真的要将整个临时文件打印到 STDOUT,还是要给出文件名这将被临时文件的内容破坏。
如果我将 STDIN 作为文件名提供,以下脚本将按预期运行,但如果我通过管道将 STDIN 传递给脚本,则该脚本不起作用。
#! /usr/bin/perl
use strict; use warnings;
my $count = 0;
while(<>)
{
$count++;
}
print "you counted $count lines. Now do you want to proceed?";
my $answer = <STDIN>;
chomp $answer;
print STDERR "answer=$answer\n";
if ( $answer eq "yes" )
{
print STDERR "you said $answer so we do something affirmative\n";
}
else
{
print STDERR "you said $answer which is not \"yes\" so we do NOT proceed\n";
}
Run Code Online (Sandbox Code Playgroud)
例如
> wc junk
193 1042 11312 junk
> junk.pl junk
you counted 193 lines. Now do you want to proceed?yes
answer=yes
you said yes so we do something affirmative
> junk.pl junk
you counted 193 lines. Now do you want to proceed?no
answer=no
you said no which is not "yes" so we do NOT proceed
> cat junk | junk.pl
Use of uninitialized value $answer in scalar chomp at /Users/BNW/u/kh/bin/junk.pl line 10.
Use of uninitialized value $answer in concatenation (.) or string at /Users/BNW/u/kh/bin/junk.pl line 11.
answer=
Use of uninitialized value $answer in string eq at /Users/BNW/u/kh/bin/junk.pl line 12.
Use of uninitialized value $answer in concatenation (.) or string at /Users/BNW/u/kh/bin/junk.pl line 18.
you said which is not "yes" so we do NOT proceed
you counted 193 lines. Now do you want to proceed?>
Run Code Online (Sandbox Code Playgroud)
有点。也许。
首先,在您的第一个示例中,您“将 STDIN 作为文件名”是不正确的。STDIN 是整个终端。<>正在从ARGV句柄读取,而不是 STDIN,因此当您需要时可以使用 STDIN。
与第二示例实施例中的问题是,从管cat 是STDIN。关闭它并重新打开它的初始状态对您没有任何作用,因为它仍然是一个用尽的管道。
然而,许多系统都有一个特殊的设备/dev/tty,它指向任何进程请求它的控制终端。在这样的系统上,您可以/dev/tty在它给出 EOF 之后重新打开 STDIN ,并且您将获得用户从中调用您的程序的控制台,而不是他们最初作为 STDIN 提供给您的任何文件或管道。
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |