Как перебрать условный массив в Perl? - PullRequest
0 голосов
/ 16 марта 2020

Я перебираю файлы в Perl, и я хотел бы получить правильное поле "Адрес" в файле. «Адрес» - это ха sh. Либо файл содержит только один «Adresse», и я его принимаю, либо он содержит несколько «Adresse», а «Adresse» на самом деле является массивом, содержащим несколько «Adresse», и мне просто нужен тот, имеющий «type» = «postale» , Вот мой код:

  my $ad;
  my $adresse;
  if(ref($doc->{'Organisme'}->{'Adresse'}) eq 'ARRAY') {
    print "\nI'M AN ARRAY!\n";
    foreach $ad ($doc->{'Organisme'}->{'Adresse'}) {
      print Dumper $ad;
      if ($ad->{'type'} == 'postale') {
       my $adresse = $ad;
      }
    }
  } else {
    my $adresse = $doc->{'Organisme'}->{'Adresse'}
  }
  print $fd $adresse->{'Ligne'};

Я получаю ошибку:

Not a HASH reference at ./scripts/actualiserDonnees.pl line 35

и строка 35:

if ($ad->{'type'} == 'postale') {

Очевидно, что "foreach" не итерируйте "$ do c -> {'Organisme'} -> {'Adresse'}", когда последний является массивом, потому что Dumper дает мне это:

$VAR1 = [
          {
            'Localisation' => {
                                "Pr\x{e9}cision" => '8',
                                'Longitude' => '1.9751304',
                                'Latitude' => '43.2279035'
                              },
            'type' => 'physique',
            'CodePostal' => '11270',
            "Accessibilit\x{e9}" => {
                                      'type' => 'ACC'
                                    },
            'NomCommune' => 'Laurac',
            'Ligne' => 'Place Blanche-de-Laurac'
          },
          {
            'Ligne' => '8 rue du Pont',
            'CodePostal' => '11270',
            'type' => 'postale',
            'NomCommune' => 'Laurac'
          }
        ];

Если я не сделал ' Тебе достаточно объяснить, не стесняйтесь задавать вопросы. Заранее спасибо:)

1 Ответ

3 голосов
/ 16 марта 2020

my $adresse создает новую переменную. Замените оба экземпляра my $adresse = ... на $adresse = ...


$doc->{'Organisme'}->{'Adresse'} - это скаляр (ссылка на массив), поэтому foreach $ad ($doc->{'Organisme'}->{'Adresse'}) зацикливается только на одном элементе (ссылка на массив) , Вы хотите foreach $ad (@{ $doc->{'Organisme'}->{'Adresse'} })

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