2017-02-06 8 views
-1

Я новичок в Perl и медленно обучаюсь. Мне нужна помощь, чтобы отлаживать этот код. Глядя на предыдущие сообщения, мне удалось отладить его, но я не получаю никакого вывода. Я боюсь, что вы, ребята, можете мне помочь .. очень ценят .. любые советы или ошибки, которые вы все замечаете ..Имея справочную проблему HASH с АНОНИМНЫМ МАССАМИ PERL INCREMENT 1

#!/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; 
} 

Я упомянул об этом были внесены изменения, насколько я мог, но не существует syntaxx ошибки или выходной, поэтому я застрял. Having HASH reference issue with perl

Not a HASH reference at main.pl line 13. 

Из вышеприведенного ввода

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

вывод, который мне нужно, чтобы получить обратно есть

[ { 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

Следующая модификация кода, кажется, чтобы дать вашему ожидаемый результат:

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

У вас есть различные вопросы, но она начинается здесь: вы звоните addtwo с массивом реф ($structure = [ … ]), и внутри этой функции она holded по $params переменной и вас разыменования его как a ref hash: $params->{...}. $params не ref hash, следовательно, ваша ошибка.

После этого я не вижу, чего вы хотите достичь именно и какое преобразование вы хотите от своего ввода к вашему выходу.

Посмотрите perlreftut для грунтовки на ссылки на Perl (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"); } 
}