【发布时间】:2012-10-07 20:49:20
【问题描述】:
我是 perl 新手,有一个关于使用数组哈希检索特定列的问题。我的代码如下:
my %hash = ( name1 => ['A', 'A', 'B', 'A', 'A', 'B'],
name2 => ['A', 'A', 'D', 'A', 'A', 'B'],
name3 => ['A', 'A', 'B', 'A', 'A', 'C'],
);
#the values of %hash are returned as arrays not as string (as I want)
foreach my $name (sort keys %hash ) {
print "$name: ";
print "$hash{$name}[2]\n";
}
for (my $i=0; $i<$length; $i++) {
my $diff = "no";
my $letter = '';
foreach $name (sort keys %hash) {
if (defined $hash{$name}[$i]) {
if ($hash{$name}[$i] =~ /[ABCD]/) {
$letter = $hash{$name}[$i];
}
elsif ($hash{$name}[$i] ne $letter) {
$diff = "yes";
}
}
if ( $diff eq "yes" ) {
foreach $name (sort keys %hash) {
if (defined $hash{$name}[$i]) { $newhash{$name} .= $hash{$name}[$i]; }
}
}
}
}
foreach $name (sort keys %newhash ) {
print "$name: $newhash{$name} \n";
}
我希望这个程序的输出类似于只有变量列的新哈希:
my %newhash = ( name1 => 'BB',
name2 => 'DB',
name3 => 'BC',
);
但只收到此消息: 在 test_hash.pl 第 31 行的字符串 ne 中使用未初始化的值 $letter。
有人对此有想法吗? 干杯
编辑:
非常感谢您在这个问题上的帮助。
我编辑了我的帖子以确认 frezik、Dan1111、Jean 的建议。你是对的,现在没有警告,但我也无法从 print 语句中获得任何输出,我对此一无所知......
@TLP:好的,我只是生成一组随机的列,没有任何排序目的。我真正想要的是字母如何变化,这意味着如果对于相同的数组索引(存储在哈希中)字母相同,则丢弃它们,但如果键之间的字母不同,我想存储该索引新哈希中的列。
干杯。
【问题讨论】:
-
您对“变量列”的定义是什么。看起来您想要除 A 之外的所有字母。或者可能是第 3 列和第 6 列中的字母。或每三个字母。但是从您的代码中,我以某种方式得到的印象是字母如何变化。那么它是什么?
-
好的,所以你想比较不同的数组,如果一列是“AAA”或“BBB”,跳过它。但是,您必须先保存这些字母,然后再进行检查。
-
没错,但我认为我将字母保存在变量 $letter 中。但是,似乎并没有将它们添加到新的哈希中...
标签: perl hash perl-data-structures