hap*_*una 0 perl hash reference subroutine
我在同一个哈希上创建子程序外部和内部的键.但是,在子例程之后,调用子例程之前创建的键中的值现在被解释为数组引用.
#!/usr/bin/perl
use module;
use strict;
use warnings;
my %hash;
my $count = 0;
my @array = ("a", "b", "c", "d");
for my $letter (@array) {
$hash{$letter} = $count;
$count++;
}
# need "\" to pass in hash otherwise changes
# will get lost outside of subroutine
foreach my $x (sort keys %hash) {
print "first $hash{$x}\n";
}
module::add_ten(\%hash);
foreach my $p (sort keys %hash) {
# $hash{$p} is printing array references, but before it was
# printing the value I desired. What did the subroutine do?
print "second $hash{$p} $hash{$p}->{ten}\n";
}
Run Code Online (Sandbox Code Playgroud)
这是带有子程序的模块
package module;
sub add_ten {
my $count = 10;
# this passes the full array as reference
my ($hash_ref) = @_; # $hash_ref is actually %hash (yes, the % is not a typo)
my @keys = keys $hash_ref;
foreach my $ltr (sort keys $hash_ref) {
$hash_ref->{$ltr} = { ten => $count };
$count++;
}
}
1;
Run Code Online (Sandbox Code Playgroud)
这是输出:
first 0
first 1
first 2
first 3
second HASH(0x7ff0c3049c50) 10
second HASH(0x7ff0c3049bc0) 11
second HASH(0x7ff0c3049b90) 12
second HASH(0x7ff0c3049b60) 13
Run Code Online (Sandbox Code Playgroud)
我期待输出为:
first 0
first 1
first 2
first 3
second 0 10
second 1 11
second 2 12
second 3 13
Run Code Online (Sandbox Code Playgroud)
我修改了我的模块:
package module;
sub add_ten {
my $count = 10;
# this passes the full array as reference
my ($hash_ref) = @_; # $hash_ref is actually %hash (yes, the % is not a typo)
my @keys = keys $hash_ref;
foreach my $ltr (sort keys $hash_ref) {
$hash_ref->{$ltr}{ten}=$count;
$count++;
}
}
1;
Run Code Online (Sandbox Code Playgroud)
和主脚本(需要注释use strict以使其工作):
#!/usr/bin/perl
use module;
#use strict;
use warnings;
my %hash;
my $count = 0;
my @array = ("a", "b", "c", "d");
for my $letter (@array) {
$hash{$letter} = $count;
$count++;
}
# need "\" to pass in hash otherwise changes
# will get lost outside of subroutine
foreach my $x (sort keys %hash) {
print "first $hash{$x}\n";
}
module::add_ten(\%hash);
foreach my $p (sort keys %hash) {
print "second $hash{$p} $hash{$p}{ten}\n";
}
Run Code Online (Sandbox Code Playgroud)
但这正是我想要达到的目标.
$hash_ref是一个引用%hash,因此当您更改引用的哈希元素的值时$hash_ref,您将更改哈希值%hash.
这意味着当你这样做
$hash_ref->{$ltr} = { ten => $count };
Run Code Online (Sandbox Code Playgroud)
你在做
$hash{a} = { ten => 10 };
Run Code Online (Sandbox Code Playgroud)
毫不奇怪,$hash{a}不再包含零.您必须更改数据结构.您可以使用以下内容:
$hash{a}{value} = 0;
$hash{a}{subhash}{ten} = 10;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |