我正在尝试使用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
为什么数据密钥会被取代?
答案 0 :(得分: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";
答案 1 :(得分:0)
以下是在BT结构中添加元素的代码。
使用严格;
使用List :: Util qw(first);
my(@ input,$ data);
print&#34;输入BST结构中的数据:&#34 ;;
$数据= LT;取代;
格格($数据);
my $ root = $ data;
推(@输入,$数据);
while($ data = ~m / \ 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);
}
打印&#34;最终BT阵列:\ n&#34;,加入(&#39;,&#39;,@输入),&#34; \ n&#34;;