2014-09-29 114 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 2014-09-29 05:18:04

回答

6

use strict;會告訴你一堆未申報的變量;用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

如何將** foreach **循環的2行代碼塊合併爲一行? 'foreach(keys%$ head){ 如果$ head - > {$ _};打印「head - > $ _ = $ head - > {$ _} \ n」; 打印「head - > $ _ = NULL \ n」if! $頭 - > {$ _}; }' – 2014-09-30 08:15:22

0

這裏是在BT結構中添加元素的代碼。

使用嚴格;

use List :: Util qw(first);

my(@ input,$ data);

print「輸入BST結構中的數據:」;

$ data = <>;;

chomp($ data);

my $ root = $ data;

push(@ input,$ data);

而($數據=〜米/ \ b - ?\ d {1,3} \ B /){

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「Final BT Array:\ n」,join(',',@input),「\ n」;