Многомерни масиви, използващи цели числа и низове

Опитвам се да настроя основна система за проверка на грешки, където да улавя грешки в обвивката, изпълнявани от системно повикване. execute_command е webmin функция, която изпълнява системно повикване и след това задава съобщение за грешка на своя 4-ти параметър. По принцип извиквам execute_command_error("adduser test"), като знам, че вече имам създаден потребител, наречен test, и въз основа на моите предварително дефинирани масиви, ID очаква да се отпечата

Не може да се добави потребител
Не може да се добави този потребител, защото той вече съществува в системата.

но вместо това получавам:

ъъъъъъъъъъъъъ?
Uhhhhhhhhh?

Проверих, че $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};

person ParoX    schedule 01.07.2009    source източник


Отговори (2)


Първо вижте perldsc за правилния синтаксис за правене на многомерни структури. Вашите масиви нямат никакъв смисъл.

Ако сте имали включени предупреждения, щяхте да видите предупреждение „Аргументът не е числов“ за да ви кажа, че не можете да използвате низове по никакъв смислен начин в индекс на масив.

Но хешът, който сте публикували във вашата актуализация, трябва да работи добре.

#!/usr/bin/perl

use strict;
use warnings;
## ^^ these things are your friends

my %ErrorMsgs =    ('adduser' =>   {
                        '1' =>  {
                                'title' =>      'Unable to add user',
                                'msg'   =>      'Unable to add that user because it already exists on the system.',
                        },
                },
                );

my $exe = 'adduser';
my $return = 1;

print $ErrorMsgs{$exe}{$return}{title};    # works

Ако не получавате изхода, който очаквате, това е защото има нещо нередно с $exe или $return -- те може да не са дефинирани в обхвата, в който се опитвате да ги използвате. Включването на строги и предупреждения ще помогне за проследяване на проблема.

person friedo    schedule 01.07.2009

{ 'key' => 'val' } създава препратка към хеш, така че дереференцирате, преди да търсите ключ.

$exe_title = $ErrorMsgs{$exe}->{$return}->{"title"};

Също така не е необходимо да поставяте в кавички $exe или $return, тъй като те вече съдържат низове.

Имайте предвид, че Perl не поддържа многомерни индекси; многомерният масив е просто масив от масиви, така че трябва да използвате [] за всеки индекс. В скаларния контекст операторът запетая връща стойността на най-десния израз, така че следните редове са еквивалентни:

$ErrorMsg[0,1,2]  = "foo";
$ErrorMsg[2]  = "foo";

Обърнете внимание, че в контекста на списъка операторът запетая връща списък със стойности, което ни дава срезове:

@a=qw(f o o);
@a[3,4,5] = qw(b a r);
print join(',', @a), "\n";
# output: f,o,o,b,a,r 
@ErrMsg{qw(title msg)} = ('Unable to add user', 'Unable to add that user because it already exists on the system.')
person outis    schedule 01.07.2009