in reply to Can't use string ("16") as a HASH ref while "strict refs" in use

As CountZero has suggested, the error can be exactly duplicated in the presence of the likely typo:

>perl -wMstrict -le "$_ = qq{chr16\t28797601\t-\t0.777877}; my %site_info; ;; my @arr = split(/\t/,$_,4); $arr[0] = substr($arr[0], 3); $site_info{$arr[0]}{$arr[1]}{'strand'} = $arr[2]; $site_info{$arr[0]{$arr[1]}}{'value'} = $arr[3]; " Can't use string ("16") as a HASH ref while "strict refs" in use at .. +.

And goes away and is replaced by something reasonable with the 'fixed' code:

>perl -wMstrict -le "use Data::Dump qw(dd); ;; $_ = qq{chr16\t28797601\t-\t0.777877}; my %site_info; ;; my @arr = split(/\t/,$_,4); $arr[0] = substr($arr[0], 3); $site_info{$arr[0]}{$arr[1]}{'strand'} = $arr[2]; $site_info{$arr[0]}{$arr[1]}{'value'} = $arr[3]; ;; dd \%site_info; " { 16 => { 28797601 => { strand => "-", value => 0.777877 } } }

Sometimes it's useful to introduce a temoprary 'convenience' variable in place of complex nested expressions:

>perl -wMstrict -le "use Data::Dump qw(dd); ;; $_ = qq{chr16\t28797601\t-\t0.777877}; my %site_info; ;; my @arr = split(/\t/,$_,4); $arr[0] = substr($arr[0], 3); ;; my $current = $site_info{$arr[0]}{$arr[1]} = {}; $current->{'strand'} = $arr[2]; $current->{'value'} = $arr[3]; ;; dd \%site_info; " { 16 => { 28797601 => { strand => "-", value => 0.777877 } } }

Or to use slicing to do multiple, 'simultaneous' assignment:

>perl -wMstrict -le "use Data::Dump qw(dd); ;; $_ = qq{chr16\t28797601\t-\t0.777877}; my %site_info; ;; my @arr = split(/\t/,$_,4); $arr[0] = substr($arr[0], 3); ;; @{ $site_info{$arr[0]}{$arr[1]} }{ qw(strand value) } = @arr[2, 3]; ;; dd \%site_info; " { 16 => { 28797601 => { strand => "-", value => 0.777877 } } }

Replies are listed 'Best First'.
Re^2: Can't use string ("16") as a HASH ref while "strict refs" in use
by thudzj (Initiate) on Aug 23, 2012 at 02:59 UTC

    Thanks a lot! Thought I got a stupid mistake,your suggestion is really helpful for my coding on hashes.