【问题标题】:Multidimensional arrays using integers and strings使用整数和字符串的多维数组
【发布时间】:2010-11-07 06:10:44
【问题描述】:

我正在尝试设置一个基本的错误检查系统,它将捕获由系统调用运行的 shell 错误。 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};

【问题讨论】:

    标签: perl arrays multidimensional-array


    【解决方案1】:

    首先,请参阅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】:

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

      【讨论】:

        猜你喜欢
        • 2013-02-01
        • 2014-04-18
        • 1970-01-01
        • 2017-09-22
        • 2011-08-08
        • 1970-01-01
        • 2020-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多