1

perl Data::Dumper から返された要素/配列へのアクセスに問題があります。次のような結果にアクセスできます。

$VAR1 = {
      'head' => {
                'source' => {
                            'credit-logo' => 'foo',
                            'feedback' => 'bar',
                            'more-information' => 'google',

次の行で、「credit-logo」の値を取得できます。

$credit=        $result->{head}->{'source'}->{'credit-logo'};

ただし、すべてが「{」ではなく「[」で始まる次のような問題があります。

$VAR1 = [
      'dwml',
      {
        'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
        'version' => '1.0',
        'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
        'xsi:noNamespaceSchemaLocation' => 'site'
      },
      [
        [
          'head',
          {},
          [
            [
              'product',
              {
                'concise-name' => 'time-series',
                'srsName' => 'WGS 1984',
                'operational-mode' => 'official'

上記で、「srsName」値にどのようにアクセスしますか?

何を試しても、値が HASH または ARRAY ではないというメッセージが表示されます。

-- 私の元のスクリプトは、NWS から予測データを取得しようとしています。

#!/usr/bin/perl

use NDFD::Weather::Report;
use Data::Dumper;


$result=NDFD::Weather::Processer->new(

    listLatLon=>'30.3369,-81.6614',
    product=>'time-series',
    Unit=>'m',
    maxt =>0,
    mint =>0,
    temp =>1,
    dew =>1,
    pop12 =>0,
    qpf =>0,
    sky =>1,
    snow =>0,
    wspd =>1,
    wdir =>1,
    wx =>1,
    waveh =>0,
    icons =>0,
    rh =>0,
    appt =>0,
    incw34 =>0,
    incw50 =>0,
    incw64 =>0,
    cumw34 =>0,
    cumw50 =>0,
    cumw64 =>0,
    conhazo =>0,
    ptornado =>0,
    phail =>0,
    ptstmwinds =>0,
    pxtornado =>0,
    pxhail =>0,
    pxtstmwinds =>0,
    ptotsvrtstm =>0,
    pxtotsvrtstm =>0,
    tmpabv14d =>0,
    tmpblw14d =>0,
    tmpabv30d =>0,
    tmpblw30d =>0,
    tmpabv90d =>0,
    tmpblw90d =>0,
    prcpabv14d =>0,
    prcpblw14d =>0,
    prcpabv30d =>0,
    prcpblw30d =>0,
    prcpabv90d =>0,
    prcpblw90d =>0,
    precipa_r =>0,
    sky_r =>0,
    td_r =>0,
    temp_r =>0,
    wdir_r =>0,
    wspd_r =>0,
    wgust =>0

);
$value= $result->NDFDgenLatLonList;
$xml_handler1=$result->Parse_XML_Data_decode($value);


print Dumper $xml_handler1;

私の目標は、その Dumper 応答から返された値を抽出することです。

次の追加により返される XML を次に示します。

--

<?xml version="1.0"?>
<dwml version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.nws.noaa.gov/forecasts/xml/DWMLgen/schema/DWML.xsd">
<head>
<product srsName="WGS 1984" concise-name="time-series" operational-mode="official">
  <title>NOAA's National Weather Service Forecast Data</title>
  <field>meteorological</field>
  <category>forecast</category>
  <creation-date refresh-frequency="PT1H">2015-10-02T15:56:10Z</creation-date>
 </product>
 <source>
  <more-information>http://www.nws.noaa.gov/forecasts/xml/</more-information>
  <production-center>Meteorological Development Laboratory<sub-center>Product Generation Branch</sub-center></production-center>
  <disclaimer>http://www.nws.noaa.gov/disclaimer.html</disclaimer>
  <credit>http://www.weather.gov/</credit>
  <credit-logo>http://www.weather.gov/images/xml_logo.gif</credit-logo>
  <feedback>http://www.weather.gov/feedback.php</feedback>
</source>
</head>
<data>
<location>
  <location-key>point1</location-key>
  <point latitude="30.34" longitude="-81.66"/>
</location>
<moreWeatherInformation applicable- >
<time-layout time-coordinate="local" summarization="none">
  <layout-key>k-p3h-n35-1</layout-key>
  <start-valid-time>2015-10-02T14:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-02T17:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-02T20:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-02T23:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-03T02:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-03T05:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-03T08:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-03T11:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-03T14:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-03T17:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-03T20:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-03T23:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-04T02:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-04T05:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-04T08:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-04T11:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-04T14:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-04T17:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-04T20:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-05T02:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-05T08:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-05T14:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-05T20:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-06T02:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-06T08:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-06T14:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-06T20:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-07T02:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-07T08:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-07T14:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-07T20:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-08T02:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-08T08:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-08T14:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-08T20:00:00-04:00</start-valid-time>
</time-layout>
<time-layout time-coordinate="local" summarization="none">
  <layout-key>k-p3h-n19-2</layout-key>
  <start-valid-time>2015-10-02T14:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-02T17:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-02T20:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-02T23:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-03T02:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-03T05:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-03T08:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-03T11:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-03T14:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-03T17:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-03T20:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-03T23:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-04T02:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-04T05:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-04T08:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-04T11:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-04T14:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-04T17:00:00-04:00</start-valid-time>
  <start-valid-time>2015-10-04T20:00:00-04:00</start-valid-time>
</time-layout>
<parameters applicable-location="point1">
  <temperature type="hourly" units="Celsius" time-layout="k-p3h-n35-1">
    <name>Temperature</name>
    <value>23</value>
    <value>23</value>
    <value>21</value>
    <value>20</value>
    <value>19</value>
    <value>18</value>
    <value>18</value>
    <value>23</value>
    <value>26</value>
    <value>25</value>
    <value>22</value>
    <value>21</value>
    <value>20</value>
    <value>19</value>
    <value>19</value>
    <value>24</value>
    <value>26</value>
    <value>26</value>
    <value>22</value>
    <value>19</value>
    <value>18</value>
    <value>27</value>
    <value>23</value>
    <value>21</value>
    <value>19</value>
    <value>27</value>
    <value>23</value>
    <value>21</value>
    <value>20</value>
    <value>27</value>
    <value>24</value>
    <value>22</value>
    <value>21</value>
    <value>28</value>
    <value>24</value>
  </temperature>
  <temperature type="dew point" units="Celsius" time-layout="k-p3h-n35-1">
    <name>Dew Point Temperature</name>
    <value>20</value>
    <value>20</value>
    <value>19</value>
    <value>18</value>
    <value>17</value>
    <value>17</value>
    <value>17</value>
    <value>17</value>
    <value>18</value>
    <value>18</value>
    <value>18</value>
    <value>17</value>
    <value>17</value>
    <value>17</value>
    <value>17</value>
    <value>17</value>
    <value>17</value>
    <value>18</value>
    <value>18</value>
    <value>18</value>
    <value>18</value>
    <value>19</value>
    <value>19</value>
    <value>18</value>
    <value>18</value>
    <value>19</value>
    <value>18</value>
    <value>18</value>
    <value>18</value>
    <value>19</value>
    <value>19</value>
    <value>19</value>
    <value>19</value>
    <value>19</value>
    <value>20</value>
  </temperature>
  <wind-speed type="sustained" units="meters/second" time-layout="k-p3h-n35-1">
    <name>Wind Speed</name>
    <value>5</value>
    <value>4</value>
    <value>4</value>
    <value>4</value>
    <value>4</value>
    <value>4</value>
    <value>4</value>
    <value>5</value>
    <value>5</value>
    <value>5</value>
    <value>4</value>
    <value>4</value>
    <value>4</value>
    <value>4</value>
    <value>4</value>
    <value>4</value>
    <value>4</value>
    <value>4</value>
    <value>3</value>
    <value>2</value>
    <value>3</value>
    <value>3</value>
    <value>4</value>
    <value>4</value>
    <value>4</value>
    <value>5</value>
    <value>4</value>
    <value>3</value>
    <value>4</value>
    <value>4</value>
    <value>4</value>
    <value>3</value>
    <value>4</value>
    <value>5</value>
    <value>4</value>
  </wind-speed>
  <direction type="wind" units="degrees true" time-layout="k-p3h-n35-1">
    <name>Wind Direction</name>
    <value>0</value>
    <value>360</value>
    <value>340</value>
    <value>340</value>
    <value>320</value>
    <value>310</value>
    <value>300</value>
    <value>280</value>
    <value>280</value>
    <value>270</value>
    <value>280</value>
    <value>280</value>
    <value>270</value>
    <value>260</value>
    <value>240</value>
    <value>250</value>
    <value>250</value>
    <value>240</value>
    <value>240</value>
    <value>260</value>
    <value>300</value>
    <value>350</value>
    <value>360</value>
    <value>350</value>
    <value>350</value>
    <value>10</value>
    <value>10</value>
    <value>20</value>
    <value>10</value>
    <value>30</value>
    <value>40</value>
    <value>40</value>
    <value>40</value>
    <value>60</value>
    <value>60</value>
  </direction>
  <cloud-amount type="total" units="percent" time-layout="k-p3h-n35-1">
    <name>Cloud Cover Amount</name>
    <value>100</value>
    <value>100</value>
    <value>100</value>
    <value>99</value>
    <value>97</value>
    <value>90</value>
    <value>79</value>
    <value>71</value>
    <value>64</value>
    <value>72</value>
    <value>79</value>
    <value>78</value>
    <value>76</value>
    <value>72</value>
    <value>69</value>
    <value>69</value>
    <value>51</value>
    <value>51</value>
    <value>35</value>
    <value>28</value>
    <value>64</value>
    <value>63</value>
    <value>63</value>
    <value>62</value>
    <value>62</value>
    <value>60</value>
    <value>48</value>
    <value>37</value>
    <value>32</value>
    <value>35</value>
    <value>37</value>
    <value>41</value>
    <value>45</value>
    <value>40</value>
    <value>31</value>
  </cloud-amount>
  <wind-speed type="gust" units="meters/second" time-layout="k-p3h-n19-2">
    <name>Wind Speed Gust</name>
    <value>7</value>
    <value>6</value>
    <value>6</value>
    <value>6</value>
    <value>6</value>
    <value>6</value>
    <value>6</value>
    <value>7</value>
    <value>7</value>
    <value>7</value>
    <value>5</value>
    <value>6</value>
    <value>6</value>
    <value>6</value>
    <value>5</value>
    <value>5</value>
    <value>6</value>
    <value>6</value>
    <value>4</value>
  </wind-speed>
  <weather time-layout="k-p3h-n35-1">
    <name>Weather Type, Coverage, and Intensity</name>
    <weather-conditions>
      <value coverage="slight chance" intensity="moderate" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="slight chance" intensity="moderate" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="slight chance" intensity="moderate" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="slight chance" intensity="moderate" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="chance" intensity="moderate" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="chance" intensity="moderate" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="chance" intensity="light" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="chance" intensity="light" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="slight chance" intensity="moderate" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="slight chance" intensity="moderate" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="slight chance" intensity="light" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="slight chance" intensity="light" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="slight chance" intensity="light" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="slight chance" intensity="light" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="slight chance" intensity="light" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="slight chance" intensity="light" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="chance" intensity="moderate" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
      <value coverage="slight chance" intensity="none" additive="and" weather-type="thunderstorms" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="chance" intensity="moderate" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
      <value coverage="slight chance" intensity="none" additive="and" weather-type="thunderstorms" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="chance" intensity="light" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
      <value coverage="slight chance" intensity="none" additive="and" weather-type="thunderstorms" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="slight chance" intensity="light" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="chance" intensity="light" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="chance" intensity="light" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="chance" intensity="light" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="chance" intensity="light" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="slight chance" intensity="light" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions>
      <value coverage="slight chance" intensity="light" weather-type="rain showers" qualifier="none">
        <visibility xsi:nil="true"/>
      </value>
    </weather-conditions>
    <weather-conditions/>
    <weather-conditions/>
    <weather-conditions/>
    <weather-conditions/>
    <weather-conditions/>
    <weather-conditions/>
    <weather-conditions/>
    <weather-conditions/>
    <weather-conditions/>
  </weather>
</parameters>

4

2 に答える 2

1

を使用しているようXML::Parser->new(Style => 'Tree')です。このパーサーのインターフェースはかなり単純化されています。かっこを数えることで、その方法を理解できます。

$VAR -> [2][0][2][0][1]{'srsName'}; 

しかし真剣に、はるかに友好的なオプションがあります。XML::Twigorを使用するだけXML::LibXMLで、上記は次のようになります。

 $twig -> findnodes('//srsName',0)->trimmed_text; 

(または似たようなもの - 私が言うように、XML を提供してください。正確な回答を提供できます)。

編集:

このように (注: モジュールをダウンロードできないため、テストされていません):

 use XML::Twig; 

 my $value= $result->LatLonListCityNames;
 my $twig = XML::Twig -> parse ( $value ); 

 my $srsName_element = $twig -> findnodes ( '//srsName', 0 );
 $srsName_element -> print;
 print $srsName_element -> trimmed_text;  
于 2015-10-02T15:29:56.040 に答える
0

問題が発生している理由[は、データがハッシュ参照ではなく配列参照に含まれているため、別の方法でアクセスする必要があるためです。

これを分解してみましょう (すべてのコンテンツをプレースホルダーに置き換えます)。

$VAR1 = [
          0 (string),
          1 (hash  ),
      --> 2 (array ) [
                   --> 0 (array) [
                                   0 (string),
                                   1 (hash  ),
                               --> 2 (array ) [
                                            --> 0 (array) [
                                                            0 (string )
                                                        --> 1 (hash   ) {
                                                                      --> 'srsName' => $val

に従って-->ください。それぞれが、データ構造をトラバースするためにアクセスする必要がある次の要素を指しています。

私はこれをテストしていませんが、次の方法でアクセスできるようです

my $srsName = $xml_handler1->[2][0][2][0][1]{'srsName'};

ただし、他の多くの人が言っているようにData::Dumper、データを使用して手動でアクセスすることは、明らかに XML を解析する良い方法ではありません。私は個人的に、これを行うために使用する必要がある「適切な」方法に精通していませんが、コメントを読んで Sobrique の回答をご覧になることをお勧めします。


余談ですが...常にスクリプトの先頭にandを追加し、 を使用してすべての変数を字句的に定義する必要があります。悪いコーディングの習慣を防ぎ、問題を見つけるのが難しいコードをデバッグしようとする多くの頭痛の種を救うことができます。use strictuse warningsmy

理由のリストについては、この記事をチェックしてください。

于 2015-10-02T15:31:02.943 に答える