2014-09-29 2 views
0

Я пытаюсь создать хеш с помощью функции в perl. Фактически я работал над созданием двоичного дерева поиска в perl. Ниже приведен код:Создание хэша с помощью функции

sub newhash { 
    $data = shift; 
    $left = undef; 
    $right = undef; 
    %node = ("data"=>$data,"left"=>$left,"right"=>$right); 
    return (\%node); 
} 

$firstele = newhash(2); 
foreach (keys %$firstele) 
{ 
    print "$_:$firstele->{$_}\n"; 
} 

$node = newhash(1); 

foreach (keys %$node) 
{ 
    print "$_:$node->{$_} \n"; 
} 

foreach (keys %$firstele) 
{ 
    print "$_:$firstele->{$_}\n"; 
} 

Проблема в том, что, когда я печать оригинальный хэш, данные ключа заменяется на то, что я передаю в функцию newhash. Выход:

left: 
right: 
data:2 
left: 
right: 
data:1 
left: 
right: 
data:1 

Любые идеи, почему ключ данных заменяется?

+3

Всегда используйте 'use strict; использовать предупреждения; '! – ikegami

ответ

6

use strict; расскажет вам о группе необъявленных переменных; lexicalize их с my и он должен решить вашу проблему. В его нынешнем виде есть только один %node, и вы переписываете его при каждом звонке на newhash.

use strict; 

sub newhash { 
    my $data = shift; 
    my $left; 
    my $right; 
    my %node = (# <-- a brand new %node every time 
     data => $data, 
     left => $left, 
     right => $right, 
    ); 
    return (\%node); # new %node, new reference 
} 

my $firstele = newhash(2); 
print "firstele data: $firstele->{data}\n"; 

my $node = newhash(1); 
print "node  data: $node->{data}\n";  
print "firstele data: $firstele->{data}\n"; 
+0

Как сделать блок строк 2 строки ** foreach ** в одну строку? 'foreach (ключи% $ head) { print" head -> $ _ = $ head -> {$ _} \ n "если $ head -> {$ _}; print "head -> $ _ = NULL \ n" if! $ Голова -> {$ _}; } ' –

0

Вот код для добавления элементов в структуру BT.

использование строгое;

Список использования :: Util qw (first);

my (@ input, $ data);

print «Введите данные для нахождения в структуре BST:»;

$ data = <>;

chomp ($ data);

my $ root = $ data;

push (@ input, $ data);

в то время как ($ Данные = ~ т/\ Ъ -? \ D {1,3} \ б /) {

my $idx=first { $input[$_] == $root } 0..$#input; 

    if($data<$root) { 

     for(my $i=0;$i<=$idx;$i++) { 

      next if($data>$input[$i]) ; 

      if($data<$input[$i]) { 

       splice(@input,$i,0,$data); 

      } 

      last; 

     } 

    } 

    if($data>$root) { 

     for(my $i=$idx;$i<=$#input;$i++) { 

      if($data>$input[$i]) { 

       if(($i+1==scalar(@input)) or ($data<$input[$i+1] && $i+1 != 

скаляр (@input))) {

    splice(@input,$i+1,0,$data); 

        last; 

       } 

       else { 

        next; 

       } 

      }    

      last; 

     } 

    } 

print "Enter the number for being in a BT structure: "; 

$data=<>; 

chomp($data); 

}

print «Конечный бит BT: \ n», join (',', @input), "\ n";

 Смежные вопросы

  • Нет связанных вопросов^_^