gpt4 book ai didi

perl - Perl 中的取消引用哈希在 Docker 容器中不起作用

转载 作者:行者123 更新时间:2023-12-02 18:44:26 26 4
gpt4 key购买 nike

我有一个 Perl 脚本,它将文本文件的每一行加载到哈希中。

&load_map($word_file,"words");

sub load_map {
my ($file_path,$assoc) = @_;
open FILE, $file_path or die "Cannot open file $file_path";

while ($line = <FILE>) {
chomp $line;
$$assoc{$line}=1;
}
close FILE;
}

稍后在脚本中,我在做某事之前查看哈希以查看是否有单词:
    if($words{$wordKey}) {
do something...
}

当我在本地环境中运行脚本时,这可以正常工作。当我在 docker 容器中运行此脚本时, $words{$wordKey}没有值(value)或找不到,所以我需要运行的代码永远不会执行。
print $words{$wordKey}在 docker 容器中是空的。在我的本地环境中为 1。

奇怪的是,我知道 docker 容器中确实存在哈希数据,因为如果我遍历整个哈希并逐个查看键,我可以看到每个键并最终找到我正在寻找的键,但这违背了哈希的全部目的。在找到 key 之前,我不必从头开始遍历整个哈希。
    while( my( $key, $value ) = each %words ){
if($key == $wordKey) {
Do something
}
}

有没有人遇到过这个问题并了解我可能会或可能不会导致这个问题的原因?这让我疯狂。

==================================================== ==============

新代码和输出

情况1:
&preload_words($word_file);

sub preload_words {
my %localhash;
my ($file) = @_;
open my $fh, '<', $file or die "Can't open $file: $!";

my $avalue;
while (my $line = <$fh>) {
chomp $line;
$localhash{$line}=1;

print "word: $line, local value: $localhash{$line} \n";
$avalue = $line;
}
close $fh;

print "a word: $avalue, a value: $localhash{$avalue} \n";

my $bvalue = $localhash{'written'};
print "b word: written, b value: $bvalue \n";
}


outputs:

...
word: worn, local value: 1
word: win, local value: 1
word: won, local value: 1
word: write, local value: 1
word: wrote, local value: 1
word: written, local value: 1 <-- last print from loop
a word: written, a value: 1 <-- avalue last dynamically set from loop
b word: written, b value: 1 <-- hardcoded last word of loop print

案例二:
&preload_words($word_file);

sub preload_words {
my %localhash;
my ($file) = @_;
open my $fh, '<', $file or die "Can't open $file: $!";

my $avalue;
while (my $line = <$fh>) {
chomp $line;
$localhash{$line}=1;

print "word: $line, local value: $localhash{$line} \n";
$avalue = $line;
}
close $fh;

print "a word: $avalue, a value: $localhash{$avalue} \n";

my $bvalue = $localhash{'wrote'};
print "b word: wrote, b value: $bvalue \n";
}

...
word: worn, local value: 1
word: win, local value: 1
word: won, local value: 1
word: write, local value: 1
word: wrote, local value: 1 <-- prints value in loop but nothing outside of loop scope.
word: written, local value: 1 <-- last print from loop
a word: written, a value: 1 <-- avalue last dynamically set from loop
b word: wrote, b value: <-- hardcoded 2nd to last word of loop print returns no value

即使在同一个函数中,它似乎也是容器中的某种范围问题。一旦我退出 while 循环,我只能直接取消引用最后一个索引。想法?

最佳答案

我不知道“docker 容器”是做什么的,但您正在使用符号引用(从字符串中生成变量名),而且您永远不应该如此轻易地这样做……如果有的话;看看 in perlfaq7 ,并在 this article seriesthis post (对于初学者)。

此外,这里甚至没有任何原因的提示——而不是使用字符串文字 ( "words" ) 来制作哈希名称只是传递一个哈希引用。或者在 sub 中构建一个哈希并返回它或其引用

sub load_map {
my ($file) = @_;
open my $fh, '<', $file or die "Can't open $file: $!";

my %assoc;
while (my $line = <$fh>) {
chomp $line;
$assoc{$line} = 1;
}
return \%assoc;
}

并在调用者中获取它,例如
my %words = %{ load_map('filename') };

如果在此之前调用者中存在哈希值的原因,则将其引用传递给子
my %words;
...
load_map('filename', \%words);

并在使用该哈希的子工作中
sub load_map { 
my ($file, $assoc) = @_;
...
while (my $line = <$fh>) {
chomp $line;
$assoc->{$line} = 1
}
return 1;
}

请注意,一旦您打开文件到 $fh ,你可以简单地填充你的哈希
my %assoc = map { chomp; $_ => 1 } <$fh>;

自从 readline (又名 <> )在列表上下文中,由 map 在此处强加, 返回文件中的所有行。

但是,上面明确的逐行代码允许您随时检查等。

我不明白问题的其余部分(作为解释出现?),但我在这里解决的问题显然是在寻找麻烦(“docker ”问题可能是由于这个原因?);它需要纠正。

关于perl - Perl 中的取消引用哈希在 Docker 容器中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57948342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com