代码之家  ›  专栏  ›  技术社区  ›  ParoX

使用整数和字符串的多维数组

  •  1
  • ParoX  · 技术社区  · 16 年前

    我正在尝试设置一个基本的错误检查系统,在那里它将捕获由系统调用运行的shell错误。 执行命令 是运行系统调用,然后将错误消息设置为其第4个参数的Webmin函数。我基本上打电话来 执行命令错误 (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};
    
    2 回复  |  直到 16 年前
        1
  •  2
  •   friedo    16 年前

    首先,见 perldsc 用于执行多维结构的正确语法。你的数组没有任何意义。

    如果你有 warnings 打开后,您会看到一个“参数不是数字”警告,告诉您不能在数组索引中以任何有意义的方式使用字符串。

    但是您在更新中发布的哈希应该可以正常工作。

    #!/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 --它们可能没有在您试图使用它们的范围内定义。开启 strict 警告将有助于跟踪问题。

        2
  •  1
  •   outis    16 年前

    '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.')