2013-08-28 48 views
0

從Debian上運行的腳本讀取用戶輸入時,我發現用戶輸入只有在按下Ctrl-D之後纔會終止,而不是在按Enter/Return鍵之後終止。用戶輸入僅在Ctrl D而不是換行時終止

my $userchoice = <>; 

對於我的腳本,我要求用戶輸入文本並用Return/Enter鍵結束它。在我的腳本中可能會導致這種情況?

可以在我的腳本中提前設置slurp模式與此有關嗎?

我看了一下perdoc,但是找不到解釋。

sub InteractiveMenu { 
    for my $key(0 .. $#desclist) { 
     my $value = $desclist[$key]; 
     printf (" %-3s %-20s -> %-15s -> %-30s\n", $key, $desclist[$key], $iplist[$key], $filelist[$key]); 
    } 
    print "\nAvailable choices:\n"; 
    printf " (R)oot key installation [installs your public key to remote servers]\n"; 
    printf " (S)etup remote logging [sets up user account on remotes]\n\n"; 
    print "Choose a server to work on:\n"; 
    chomp(my $userchoice = <>); 
} 
sub ListRemotes { 
    print "Listing remote servers from $Confile\n"; 
    open my $ReadHandle, "<", $Confile or die $!; 
    local $/; # enable localized slurp mode 
    chomp(my $content = <$ReadHandle>); 
    close $ReadHandle; 
    my @values = split('zone ', $content); 
     foreach my $val (@values) {  
     #print $val."\n-------------------------\n"; 
     &ListWorker($val); 
     } 
    InteractiveMenu(); 
} 

enter image description here

+0

什麼你已經張貼會讀一個回車終止一行。它不需要Ctrl-D。 – geoffspear

+0

它會不斷請求用戶輸入,直到按下Ctrl-D,至少在我的Debian bash shell中。 – Droidzone

+0

顯示您的實際代碼。 – geoffspear

回答

2

能設置啜食模式早些時候在我的腳本與此有關?

是的。將$/設置爲undef導致readline(又名<>)讀取直到文件結束,而不是直到行尾。 Ctrl-D使您的終端發出EOF信號。

+0

完成slurp模式後重置它的正確方法是什麼? – Droidzone

+0

'local $ /;'而不是'$/= undef;'會導致它在範圍末尾自動重置。 – ikegami

+0

我的意思是 - 假設需要在同一範圍內同時使用slurp模式和逐行讀取,是否有重置它的方法? – Droidzone

0

要重置Slurp的模式,你可以把思樂普模式劃分成範圍

open my $ReadHandle, "<", $Confile or die $!; 
{ 
    local $/; # enable localized slurp mode 
    chomp(my $content = <$ReadHandle>); 
} 
close $ReadHandle; 
相關問題