in reply to Adding row in a hash Help!!

This ought to do it. perldsc.

use Data::Dumper; # So that we can inspect our result. # Initial state. my $aref = [ { 'xml_api_reply' => { '-version' => '1', 'weather' => { '-row' => '0', 'current_conditions' => { } }, }, }, ]; # Now add 'report_date' key and its value at the appropriate level. $aref->[0]{'xml_api_reply'}{'weather'}{'report_date'} = { '-data' => ' +08-19-2012 @ 15:40:26' }; # Inspect the result. print Dumper $aref;

Dave

Replies are listed 'Best First'.
Re^2: Adding row in a hash Help!!
by Anonymous Monk on Aug 20, 2012 at 02:27 UTC
    Hi Dave, any ideas why it does not work with more data like in this code?
    #!/usr/bin/perl -w use strict; use CGI qw(-oldstyle_urls :standard); use Data::Dumper; use Date::Format; use Date::Parse; my $q = new CGI; use vars qw($vars); $| = 1; my @data; my $today = get_timezone(); #set $Data::Dumper::Purity to 1 if you have nested references $Data::Dumper::Purity = 1; #open (FILE, ">data.txt") or die "can't open file: $!"; my $weather_data = do "data.txt"; for my $w_data (@$weather_data) { push @data, $w_data; } # Now add 'report_date' key and its value at the appropriate level. push @data, $data->[0]{'xml_api_reply'}{'weather'}{'report_date'} = { +'-data' => $today }; print Dumper(\@data); #print FILE Dumper(\@data); #close FILE or die "can't close file: $!"; sub get_timezone { ### Get our local time. $ENV{'TZ'} = 'America/New_York'; $today = time2str( "%m-%d-%Y \@ %H:%M:%S", time); }

    data.txt
    $VAR1 = [ { 'xml_api_reply' => { '-version' => '1', 'weather' => { '-row' => '0', 'current_conditions' = +> { + 'icon' => { + '-data' => '/ig/images/weather/mostly_cloudy.gif' + }, + 'temp_f' => { + '-data' => '70' + }, + 'temp_c' => { + '-data' => '21' + }, + 'wind_condition' => { + '-data' => 'Wind: E at 7 mph' + }, + 'humidity' => { + '-data' => 'Humidity: 65%' + }, + 'condition' => { + '-data' => 'Mostly Cloudy' + } + }, } } }, ];

    Thanks for trying to help!

      ...any ideas why it does not work with more data like in this code?

      Because you pasted code without taking the time to understand what it's doing.

      There are resources available: perlintro, perlref, perlreftut, and perldsc.


      Dave

      And what does, "does not work" mean this time?

      I got a pretty clear error message when running your script:

      Global symbol "$data" requires explicit package name ...

      Which led me to this line:

      push @data, $data->[0]{'xml_api_reply'}{'weather'}{'report_date'} = {' +-data' => $today };

      Which I changed to this:

      push @data, $weather_data->[0]{'xml_api_reply'}{'weather'}{'report_dat +e'} = {'-data' => $today };

      Now it runs without errors.

        It runs, but look at the extra line added to end end of the file:
        ... $VAR1->[1] = $VAR1->[0]{'xml_api_reply'}{'weather'}{'report_date'};
        Here is the answer:
        $data[0]{'xml_api_reply'}{'weather'}{'report_date'} = {'-data' => $tod +ay };

        No need to use push!