При объединении 2-х хешей в Perl я получаю дополнительный элемент "undef" - PullRequest
1 голос
/ 15 марта 2011

У меня есть два хэша, и когда я присоединяюсь к ним, я получаю дополнительный элемент "undef".Почему?

#!/usr/bin/perl
use Data::Dumper;

my %foo = (
    "disable-notify",
    "start=s",
    "end=s"
);

test();

sub test() {
    my %bar = (
    "notify-disabled",
    "durtion=s",
    "help",
    "my-stuff"
);

my %poop = (%foo, %bar);
print Dumper(%poop);
}

Запуск кода дает мне:

$VAR1 = 'notify-disabled';
$VAR2 = 'durtion=s';
$VAR3 = 'help';
$VAR4 = 'my-stuff';
$VAR5 = 'disable-notify';
$VAR6 = 'start=s';
$VAR7 = 'end=s';
$VAR8 = undef;

Откуда появился этот undef?

Ответы [ 5 ]

5 голосов
/ 15 марта 2011

Ну, во-первых, ваш хеш-синтаксис немного шаткий.Если бы вы сделали это с помощью обозначения большой стрелкой, это было бы более очевидно:

my %foo = (
    "disable-notify" => "start=s",
    "end=s"
);

и

my %bar = (
    "notify-disabled" => "durtion=s",
    "help" => "my-stuff"
);

, поэтому у вас есть четное число пар ключ-значениеи поэтому "end = s" назначается в качестве ключа для неопределенного значения.Короче говоря, вы делаете это неправильно.

1 голос
/ 15 марта 2011

Вы пытаетесь выполнить синтаксический анализ параметров с помощью Getopt :: Long? Если это так, вы путаете опция значение HASH с опцией формат LIST.

Вы неправильно инициализируете свои хеши; хэши всегда состоят из пар элементов.

Вам нужно сделать это:

my %options = (start=>$your_default_start_here,
               end=>$your_default_end_here,
               # any other defaults here
);

my $options_ok = GetOptions(\%options,
      "disable-notify",
      "start=s",
      "end=s");

Аргументами GetOpt являются хэш ссылка (входные значения начальных значений и выходные данные разобранного значения), за которыми следует список спецификаторов параметров.

1 голос
/ 15 марта 2011

Следующее присваивает нечетные элементы хешу:

my %foo = (
    "disable-notify",
    "start=s",
    "end=s"
);

Именно поэтому использование => (оператор жирной запятой) вместо , предпочтительнее при назначении ключей и значений хешу. Гораздо легче будет обнаружить такие ошибки.

1 голос
/ 15 марта 2011

Хэши имеют парные ключи и значения; Ваш хэш% foo не имеет значения для ключа "end = s", поэтому предполагается, что он не определен. Вы бы увидели это в% foo, если бы выбросили это. Если вы включите предупреждения (что вы всегда должны делать), вы получите предупреждение «Нечетное количество элементов в назначении хэша» в строке настройки% foo.

0 голосов
/ 15 марта 2011

Я исправил это. Видите, хотя --start является глобальным, его значение по умолчанию может варьироваться в зависимости от совершаемого вами действия. Итак, я делаю это:

my %global_args = (
    "help" => undef,
    "start=s" => undef,
    "end=s" => undef,
    "hosts" => undef,
    .....
);

do_status();
sub do_status() {
    my %local_args = (
       "duration" => undef,
       "status=s" = > undef,
       ...
    );

    my %args = (%global_args, %local_args);
    if(!GetOptions(\%args, keys %status_args)) {
        die "blah blah\n";
    }
}

Теперь, когда я запускаю скрипт и печатаю Dumper (\% args), я получаю:

$VAR1 = {
      'cluster' => 'music.mud',
      'end' => 'now  + 10 min',
      'start' => 'now',
      'property' => 'music'
};

Что я и должен увидеть. Спасибо, ребята, за понимание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...