![](/img/trans.png)
[英]Discarding extra newlines on STDIN in Perl without Term::ReadKey
[英]Term::ReadKey, "Strg+D" and STDIN
當我在Enter a string:
后Enter a string:
例如a
, b
, c
,然后兩次Ctrl + D我得到一個無限循環,它不會在ReadKey
上ReadKey
並且我不能用Q鍵停止?
#!/usr/bin/env perl
use warnings;
use 5.10.1;
use Term::ReadKey;
while( 1 ) {
my $c;
say "Press the \"q\" key to quit.";
print "Press the \"e\" key to enter a string: ";
{
$|++;
Term::ReadKey::ReadMode 'ultra-raw';
$c = ReadKey 0;
Term::ReadKey::ReadMode 'restore';
}
exit if ord( $c ) == 3; # Control C
last if $c eq 'q';
if ( $c eq 'e' ) {
print "\nEnter a string: ";
my $string = <>;
if ( not defined $string ) {
say "Undefined";
}
else {
chomp $string;
say "You entered |$string|";
}
}
say "Still running";
}
鍵入兩個Ctrl - D (EOT) 后,您的程序將只接收 NUL 字節。 和無窮無盡的。 不幸的是,您在無限循環中進行了無條件讀取。 要么更改它(例如,如果用戶鍵入q
或e
以外的內容,則給他一個教訓,如果他在第三次嘗試后沒有得到它,則退出),或者正確實現控制字符。 您的模塊在您獲得輸入之前就從輸入中去除了所有控制字符,但它提供了必要的掛鈎。 我敦促您也添加Ctrl - C (它僅在需要一行時起作用,而不是在讀取字符時起作用)。
另外,為什么不將輸入字符與字符串相等進行比較? $c eq "q"
讀起來更好。
將終止循環的唯一行是這一行:
last if ord( $c ) == 113;
因此,逃避循環的唯一方法是在提示要求您輸入“e”時輸入“q”。
大概您希望在if
語句中適當地放置last
,以便 ctrl-d 和/或任何文本將終止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.