Тестирование для различных типов хеш-значений в Perl? - PullRequest
0 голосов
/ 25 ноября 2010

Я пишу небольшой Perl-скрипт, который проходит через XML-файл через XML::Simple

my $xml = new XML::Simple;
my $detail= $xml->XMLin($xml_local);

Иногда содержимое элемента в XML пустое.

Когдав элементе XML нет содержимого, и я пытаюсь распечатать содержимое, используя:

print $detail->{Parsing}->{Through}->{XML}->{ElementContents}

Я получаю вывод:

HASH(0x18948c4)

...... или что-то подобное ..... единственное отличие - символы между () *

Я хочу проверить, является ли содержимое пустым, и по умолчанию переменная - что-то еще - возможно'' или "" - что угодно, кроме ссылки на хэш / адреса / чего бы то ни было.

Я пробовал это, но получил ошибку, что это не ссылка на массив:

print $detail->{Parsing}->{Through}->{XML}->{ElementContents}[0]


ОБНОВЛЕНИЕ

Вывод одного из элементов с использованием Data::Dumper:

'something' => [
           {
             'somedetail' => '',
             'somedetail' => '',
             'somedetail' => 'http://www.google.com'
             'somedetail' => 'google',
             'somedetail' => '1',
             'somedetail' => '01/21/02'
           },

Как можноЯ проверяю эти '' пустые строки, используя Perl?Они возвращаются как HASH(0x18948c4), если не включена некоторая фильтрация.

Ответы [ 2 ]

3 голосов
/ 25 ноября 2010

Причина, по которой он печатает HASH(0x18948c4), заключается в том, что содержимое этого значения на самом деле не пустое, а хэш-ссылка.Когда вы печатаете что-то, Perl пытается это что-то упорядочить, и результат строковой ссылки на хеш-строку - HASH(address), где address - это адрес фактического хеш-значения.

Распечатайте фактическое содержимое этого хеш-значения следующим образом:

use Data::Dumper;
print Data::Dumper->Dump([$detail->{Parsing}->{Through}->{XML}->{ElementContents}]);

Если, как вы говорите, «нет содержимого», это, вероятно, будет пустой хэш-код:

$VAR1 = {};

Если это так, вы можете проверить его с помощью:

if (ref($detail->{Parsing}->{Through}->{XML}->{ElementContents}) eq ref({})
  && !keys %{ $detail->{Parsing}->{Through}->{XML}->{ElementContents} })
    print "No contents, empty hashref";
}

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

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

Например, если ваш вывод Data :: Dumper был:

$VAR1 = {
          'a' => 1
        };

Тогда вам нужно распечатать$detail->{Parsing}->{Through}->{XML}->{ElementContents}->{a}, очевидно.Опять же, будьте осторожны, чтобы печатать только то, что является скаляром, а не массивом или хеш-ссылкой, поэтому идите вниз по структуре данных столько, сколько необходимо, чтобы добраться до скаляра.

0 голосов
/ 25 ноября 2010

Это модифицированная версия ответа ДВК, которая работала для меня:

if (ref($detail->{Parsing}->{Through}->{XML}->{ElementContents}) eq ref({}))
{
    ...empty element content...
}

Мне нужно было удалить второе условие if(condition1 && condition2) заявления, которое он мне дал.

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