Я пытаюсь настроить базовую систему проверки ошибок, в которой она будет обнаруживать ошибки оболочки, запускаемые системным вызовом. execute_command — это функция webmin, которая запускает системный вызов, а затем устанавливает сообщение об ошибке в свой 4-й параметр. В основном я вызываю execute_command_error("adduser test"), зная, что у меня уже есть пользователь с именем test, созданный и основанный на моих предопределенных массивах, я ожидаю, что он напечатает
Невозможно добавить пользователя
Невозможно добавить этого пользователя, поскольку он уже существует в системе.
но вместо этого я получаю:
Уххххххх?
Аххххххх?
Я проверил, что $exe и $return являются «adduser» и 1 соответственно. Что я не понимаю в массивах? Кажется, игнорирует строку и/или число и просто использует последнее определение с 3 элементами. Каково решение этого или лучшее решение?
Вот код:
$ErrorMsg['adduser',1,'title'] = "Unable to add user";
$ErrorMsg['adduser',1,'msg'] = "Unable to add that user because it already exists on the system.";
$ErrorMsg['random',2,'duaisdhai'] = "Uhhhhhhhhh?";
sub execute_command_error
{
my $error = "";
my $cmd = $_[0];
$return = execute_command($cmd, undef, undef, \$error)>>8;
if ($error) {
my ($exe) = $cmd =~ m|^(.*?)[ ]|;
$exe_title = $ErrorMsg[$exe,$return,'title'];
$exe_msg = $ErrorMsg[$exe,$return,'msg'];
print $exe_title."<br>";
print $exe_msg ."<br>";
}
}
Обновлять:
Я думаю, что мне нужно использовать хэши, я понятия не имею, почему я думал, что могу использовать строки в индексах. С учетом сказанного, небольшое исследование привело меня к чему-то вроде этого:
%ErrorMsgs = ('adduser' => {
'1' => {
'title' => 'Unable to add user',
'msg' => 'Unable to add that user because it already exists on the system.',
},
},
);
Теперь, как я могу ссылаться на него, используя переменную? потому что ни один из них не работает:
$exe_title = $ErrorMsgs{"$exe"}{"$return"}{"title"};
$exe_title = $ErrorMsgs{$exe}{$return}{title};