Ваши непосредственные проблемы были вызваны кавычками и отсутствием use warnings
в вашем скрипте.
Стоит также отметить, что скрипты на основе меню, подобные вашим, являются идеальными кандидатами для таблиц отправки . Таблица диспетчеризации - это метод определения действий в качестве данных. Действия являются подпрограммами Perl. Данные обычно представляют собой набор пар ключ-значение, которые в конечном итоге сохраняются в хэше.
Ключи хеша - это выбор, сделанный пользователем (пункты меню 1-6 в вашем случае).
Значения в хэше называются ссылками на код. Есть два способа установить эти ссылки на код: (1) непосредственно в таблице диспетчеризации, используя анонимные подпрограммы; или (2) используя синтаксис &\foo
, который создаст ссылку на подпрограмму с именем foo
.
Удобным в этом подходе является то, что ваш метод menu()
можно использовать повторно - просто с другой таблицей отправки и другим сообщением об использовании.
Этот пример настолько мал, что польза от повторного использования может показаться неубедительной, но общий метод получения данных - в форме таблицы диспетчеризации - поведения программы управления является мощным во многих контекстах.
# Always use both of these.
use strict;
use warnings;
sub dispatch_table {
return
1 => sub { system 'date' },
2 => \&ls_path,
3 => sub { system 'cal' },
4 => sub { system 'vi' },
5 => sub { system 'bc' },
6 => sub { print "Goodbye!\n"; sleep 2 },
;
}
sub ls_path {
print "\nEnter the path: ";
chomp(my $path=<STDIN>);
# Note quoting. To be super robust, you would
# need to escape apostrophes in the path.
system "ls '$path'";
}
sub usage_message {
return "Choose wisely:
Option Command
====== =======
1 Date
2 Directory Listing
3 Calendar
4 Vi Editor
5 Calculator
6 Exit
";
}
sub menu {
system 'clear';
my %dt = dispatch_table();
my $option;
print usage_message();
while (1){
print "> ";
chomp($option = <STDIN>);
last if exists $dt{$option};
}
$dt{$option}->();
}
menu();