我正在嘗試使用 Perl 為服務器中的簡單選單制作腳本,該選單具有從 1 到 3 的三個選項,如果您輸入任何其他數字,它應該提示您輸入從 1 到 3 的數字。代碼是如下:
sub main_menu ()
{
system('clear');
print ('########## BIENVENIDOS A TERMINAL SERVER DE GOSIT ##########\n\n\n\n\n
Seleccione una accion:\n\n
1) Administracion de dispositivos\n
2) Gestion de backups\n
3) Salir del Terminal Server\n\n\n
Ingrese opcion: ');
$action = <>;
do
{
if ($action < '1' || $action > '3')
{
print (" Por favor seleccione una opcion valida: ");
$action = <>;
print ("\n\n");
}
elsif ($action == '1')
{
#admin_menu();
print ("to admin menu\n");
}
elsif ($action == '2')
{
#backup_menu();
print ("to backup menu\n");
}
elsif ($action == '3')
{
print ("Saliendo de TERMINAL SERVER\n\n");
exit
}
} until ($action == '1' || $action == '2' ||$action == '3' );
}
main_menu();
在測驗此腳本時,如果用戶輸入大于 3 或小于 1 的數字,則會提示錯誤訊息,但如果稍后輸入任何輸入值,則腳本結束,以下是我所做的測驗:





uj5u.com熱心網友回復:
您的問題是,當您將重試函式放在 if 子句中時,您的回圈控制和列印陳述句是分開的。然后執行將從第一個 if 子句繼續,跳過所有其他elsifs 并直接跳到最后,它將滿足until并退出。
您還嘗試\n在單引號字串中使用。那是行不通的,你需要一個雙引號字串。
您需要的是只有一個 read 陳述句,并在讀取失敗時重試整個回圈。像這樣
use strict;
use warnings;
sub main_menu {
while (1) { # loop can only be exited manually
system('clear');
print '########## BIENVENIDOS A TERMINAL SERVER DE GOSIT ##########\n\n\n\n\n
Seleccione una accion:\n\n
1) Administracion de dispositivos\n
2) Gestion de backups\n
3) Salir del Terminal Server\n\n\n
Ingrese opcion: ';
my $action = <>;
no warnings 'numeric'; # disable numeric warnings
if ($action == 1) {
print ("to admin menu\n");
} elsif ($action == 2) {
print ("to backup menu\n");
} elsif ($action == 3) {
print ("Saliendo de TERMINAL SERVER\n\n");
exit
} else {
print (" Por favor seleccione una opcion valida.\n");
}
print "Press any key to continue..."; # needed to be able to read message
<>; # for pausing the screen
};
}
main_menu();
注意no warnings 'numeric'添加。此代碼依賴于您在關閉警告的情況下運行它,否則您會收到有關數值比較的警告:
Argument "asd" isn't numeric in numeric eq (==) at ...
修復它的一種方法是清理輸入并強制它為數字,即使它不是。例如
$action =~ s/\D //g; # remove non-numbers
$action = 0 unless $action; # if "" turn it into 0
或者您可以忽略這些警告
no warnings 'numeric';
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/485310.html
下一篇:檢查陣列和哈希是否為空
