2017-02-06 8 views
-1

私はperlを使い慣れておらず、ゆっくりと学習しています。私はこのコードをデバッグするのに助けが必要です..前の投稿を見る私はそれをデバッグすることができましたが、私は出力を得ません..私はあなたが私を助けることができます苦労している..多くの評価..すべてのヒントやバグは、 ..PERL INCREMENT ANONYMOUS ARRAYでHASH参照の問題が発生しました。

#!/usr/bin/perl 

use strict; 


use warnings 'all'; 

my $structure = [ { a => 1, b => 2, c => 3 }, { d => 4, e => 5 }, [ 6, 7, 8 ], 9, 10, 11, [ 12, 13, 14 ] ]; 
print addtwo($structure); 
    sub addtwo { 

    my $params = shift; 
    my $s = $params->{$structure}; 

    if (ref($s) eq "ARRAY") { 
     my $c = 0; 
     foreach my $e (@{$s}) { 
      $s->[$c] = addtwo({ structure => $e }); 
      $c++; 
     } 
    } elsif (ref($s) eq "HASH") { 

     if (scalar keys %{$s} == 0) { 
      return undef; 
     } else { 
      foreach my $e (values %{$s}) { 
       $s->{$e} = addtwo({ structure => $s->{$e} }); 
      } 
     } 

    } else { 
     $s = 1; 
    } 

    return my $c; 
} 

私はこれまでの変更を言及していますが、構文xエラーや出力がないので、私は立ち往生していません。上記の入力

[ { a => 1, b => 2, c => 3 }, { d => 4, e => 5 }, [ 6, 7, 8 ], 9, 10, 11, [ 12, 13, 14 ] ] 

私は戻って取得する必要があり、出力からHaving HASH reference issue with perl

Not a HASH reference at main.pl line 13. 

IS

[ { a => 2, b => 3, c => 4 }, { d => 5, e => 6 }, [ 7, 8, 9 ], 10, 11, 12, [ 13, 14, 15 ] ] 

タスクを変更し、出力を達成するために文を追加することです。

代わりに、私は私の理解、私はそれをインクリメントする配列とハッシュ値にアクセスすることはできませんように、出力が期待されていないよう

sub addone { 
    my ($aref) = @_; 
    for my $elem (@$aref){ 
     if (ref $elem eq 'ARRAY'){ 
      print "array:\n"; 
      my $var = "@$elem" ; 
      print "$_," for @$elem; 
     } 
     elsif (ref $elem eq 'HASH'){ 
      print "hash:\n"; 
      print "$_ => $elem->{$_}," for keys %$elem; 
     } 
     else { 
      $elem+1; 
      print "$elem,"; 
     } 
    } 
} 

にこれを書いています。値をインクリメントして希望の出力に格納する方法は?

私はあなたが様々な問題を抱えているが、それはここから始まるこの

Useless use of addition (+) in void context at main.pl line 29.                                  
a => 1,b => 2,c => 3,e => 5,d => 4,6,7,8,9,10,11,12,13,14, 
+5

あなたは、コードからあなたの意図を推測させる代わりに、コードが想定していることを説明する必要があります。そして、タイトルはより記述的で、大文字ではありません。 –

+0

何らかの関連性:http://stackoverflow.com/questions/41860863/having-hash-reference-issue-with-perl – mob

+0

これは宿題ですか? – Borodin

答えて

0

をPerlのリファレンスのプライマーのためのperlreftutを見てください:

use strict; 
use warnings; 

use Data::Printer; 

my $structure = [ 
    { a => 1, b => 2, c => 3 }, 
    { d => 4, e => 5 }, 
    [ 6, 7, 8 ], 9, 10, 11, [ 12, 13, 14 ] 
]; 

sub addtwo { 
    my $s = shift; 

    if (ref($s) eq "ARRAY") { 
     for my $e (@$s) { 
      ref $e ? addtwo($e) : $e++; 
     } 
    } 
    elsif (ref($s) eq "HASH") { 
     for my $key (keys %$s) { 
      my $item = $s->{$key}; 
      ref $item ? addtwo($item) : $s->{$key}++; 
     } 
    } 
    else { 
     die "Unexpected input: ref \$s = " . (ref $s) . "\n"; 
    } 
} 

addtwo($structure); 
p $structure; 

出力

[ 
    [0] { 
     a 2, 
     b 3, 
     c 4 
    }, 
    [1] { 
     d 5, 
     e 6 
    }, 
    [2] [ 
     [0] 7, 
     [1] 8, 
     [2] 9 
    ], 
    [3] 10, 
    [4] 11, 
    [5] 12, 
    [6] [ 
     [0] 13, 
     [1] 14, 
     [2] 15 
    ] 
] 
0

を取得する:あなたは、としてデリファレンス参照配列($structure = [ … ])とaddtwoを呼び出し、この関数の中には$params変数によってニコラウスされ、 refハッシュ:$params->{...}$paramsは、refハッシュではないため、あなたのエラーです。

その後、私はあなたが何を正確に達成したいのか、入力から出力までどのような変換が必要なのか見当たりません。

は、コードの以下の変更は、あなたの期待される出力を与えるように思われる(システム上man perlreftut

0

お客様のaddoneは正しい方向にあります。再帰と値の変更を追加するだけです。

sub add { 
    my $ref = ref($_[0]); 
    if ($ref eq ""  ) { ++$_[0];       } 
    elsif ($ref eq "ARRAY") { add($_) for @{ $_[0] };   } 
    elsif ($ref eq "HASH" ) { add($_) for values %{ $_[0] }; } 
    else      { croak("Unexpected input: $ref"); } 
} 
関連する問題