perl - 将字符串和哈希引用传递给子例程
问题描述
我将一个字符串和一个哈希传递给一个子例程,其中接受哈希作为对子例程的引用。在子例程调用结束时,我希望我的哈希被填充。快照:
#!/usr/local/bin/perl5.8
sub passHashAndFile {
my ($file, $hashRef) = @_;
open(HANDLE, $file) or die("Can not open file $file \n");
while(<HANDLE>) {
my @splitted_values = split("--", $_);
$hashRef->{$spllited_values[0]} = $hashRef->{$spllited_values[1]};
}
close(HANDLE);
}
my %hash;
passHashAndFile("test.txt", %hash);
foreach my $elem (keys %hash) {
print "Key = $elem, Value = $hash{$elem}\n";
}
我的 test.txt 看起来像这样:
1--2
3--4
5--6
7--8
我将哈希作为参考,然后将其取消引用以填充值。它做错了什么?
解决方案
passHashAndFile("test.txt", %hash);
应该
passHashAndFile("test.txt", \%hash);
此外,您拼错了变量名称,分配了错误的值,使用了未本地化的全局变量,并且使用了有问题的 2-arg open
。此外,大多数人会让 sub 返回一个哈希引用,而不是把一个引用指向一个空哈希。
#!/usr/local/bin/perl5.8
use strict;
use warnings;
sub parse_file {
my ($qfn) = @_;
open(my $fh, '<', $qfn)
or die("Can't open file \"$qfn\": $!\n");
my %hash;
while (my $line = <$fh>) {
my ($key, $val) = split(/--/, $line);
$hash{$key} = $val;
}
return \%hash;
}
my $hash = parse_file("test.txt");
for my $key (keys %$hash) {
print "Key = $key, Value = $hash->{$key}\n";
}
我们通常会忽略我们的答案,但总是使用use strict; use warnings;
. 它至少会发现其中一个问题。
推荐阅读
- python - 基于字符串方法的python集合的子集
- html - 如何从 CSS 样式中排除具有填充属性的 SVG
- powerbi - power bi 的累积平均值
- amazon-web-services - Elastic Beanstalk 拒绝 AWS S3 存储权限
- c++ - std::thread() 和 std::ref() 在类内部使用时会导致构建错误
- javascript - 如何使用 NgxIndexedDB 从 indexedDB 索引中获取多条记录?
- python - 处理来自 Youtube 的实时视频以将语音转换为文本
- javascript - 将外部 javascript 文件加载为节点进程
- signalr - Signalr 个人聊天
- linux - 如何将字符串中的所有 IP 地址放入 bash 数组中