Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 数组(0x7FF4B0C7B8)错误:数组的perl哈希_Arrays_Perl_Hash - Fatal编程技术网

Arrays 数组(0x7FF4B0C7B8)错误:数组的perl哈希

Arrays 数组(0x7FF4B0C7B8)错误:数组的perl哈希,arrays,perl,hash,Arrays,Perl,Hash,虽然我的代码运行时没有抛出致命错误,但输出显然是错误的。我首先创建数组的散列。然后根据散列中的键搜索文件中的序列。如果序列作为散列中的键存在,我将打印键和相关值。这应该足够简单,我正在正确地创建数组的散列。然而,当我打印相关的值时,我得到了“ARRAY(0x7ff4bbb0c7b8)” 文件“infle”是选项卡分隔的,如下所示,例如: AAAAA AAAAA BBBBB BBBBB BBBBB 这是我的密码: use strict; use warnings;

虽然我的代码运行时没有抛出致命错误,但输出显然是错误的。我首先创建数组的散列。然后根据散列中的键搜索文件中的序列。如果序列作为散列中的键存在,我将打印键和相关值。这应该足够简单,我正在正确地创建数组的散列。然而,当我打印相关的值时,我得到了“ARRAY(0x7ff4bbb0c7b8)”

文件“infle”是选项卡分隔的,如下所示,例如:

AAAAA      AAAAA
BBBBB      BBBBB      BBBBB
这是我的密码:

use strict; 
use warnings; 

open(INFILE, '<', '/path/to/file') or die $!; 
my $count = 0; 

my %hash = ( 
     AAAAA    => [ "QWERT", "YUIOP" ], 
     BBBBB    => [ "ASDFG", "HJKL", "ZXCVB" ], 
);

while (my $line = <INFILE>){ 
    chomp $line; 
    my $hash; 
    my @elements = split "\t", $line; 
    my $number = grep exists $hash{$_}, @elements; 
    open my $out, '>', "/path/out/Cluster__Number$._$number.txt" or die $!; 
    foreach my $sequence(@elements){
        if (exists ($hash{$sequence})){ 
            print $out ">$sequence\n$hash{$sequence}\n"; 
        }
        else 
        {
            $count++; 
            print "Key Doesn't Exist ", $count, "\n"; 
        } 
    }
}
预期输出如下所示:

>AAAAA 
QWERT 
>AAAAA 
YUIOP
非常感谢你的帮助

在这一行中:

print $out ">$sequence\n$hash{$sequence}\n";
$hash{$sequence}
是对数组的引用。在打印引用的数组之前,必须取消引用该数组。下面是一个打印
$sequence
的示例,然后在下一行打印
$hash{$sequence}
数组的元素,元素之间用逗号分隔:

print $out ">$sequence\n";
print $out join ', ', @{ $hash{$sequence} };

这里的关键是使用散列所持有的arrayref,而不仅仅是试图打印它。不管怎样,您都希望从数组中删除第一项,您可以使用函数执行此操作。然后,您可以将该项添加到数组的末尾,也可以在没有更多项时从哈希中删除该项,具体取决于在所有键都使用一次时希望执行的操作。您还可以使用如下函数从数组中选择一个随机元素:

my $out_seq = $hash{$sequence}[rand $@{ $hash{$sequence} }];
如果希望项目在随机情况下用完,则需要从数组中删除该项目。最好的方法可能是使用(一般形式的
shift
、和
push
):

这是我的程序版本:

#!/usr/bin/perl

use strict;
use warnings;

use strict;
use warnings;

# open my $in, '<', '/path/to/file') or die $!;
my $in = \*DATA; #use internal data file instead for testing
my $count = 0;

my %hash = (
    AAAAA    => [ "QWERT", "YUIOP" ],
    BBBBB    => [ "ASDFG", "HJKL", "ZXCVB" ],
);

while (<$in>) {
    chomp;
    my $hash;
    my @elements = split "\t";
    my $number = grep exists $hash{$_}, @elements;
    #open my $out, '>', "/path/out/Cluster__Number$._$number.txt" or die $!;
    my $out = \*STDOUT; # likewise use STDOUT for testing
    for my $sequence (@elements) {
        if (exists $hash{$sequence}) {
            my $out_seq = shift @{ $hash{$sequence} };
            # if you want to repeat
            push @{ $hash{$sequence} }, $out_seq;
            # if you want to remove $sequence when they run out
            # delete $hash{$sequence} unless @{ $hash{$sequence} };

            print $out ">$sequence\n$out_seq\n";
        } else {
            warn "Key [$sequence] Doesn't Exist ", ++$count, "\n";
        }
    }
}

__DATA__
AAAAA   AAAAA
CCCCC
BBBBB   BBBBB   BBBBB
#/usr/bin/perl
严格使用;
使用警告;
严格使用;
使用警告;
#打开我的$in、、“/path/out/Cluster\uuuuu Number$.\uu$Number.txt”或die$!;
我的$out=\*STDOUT;\同样,使用STDOUT进行测试
对于我的$sequence(@elements){
if(存在$hash{$sequence}){
my$out_seq=shift@{$hash{$sequence};
#如果你想重复
push@{$hash{$sequence}},$out\u seq;
#如果要在$sequence用完时删除它们
#删除$hash{$sequence},除非@{$hash{$sequence};
打印$out“>$sequence\n$out\u seq\n”;
}否则{
警告“键[$sequence]不存在”、++$count、“\n”;
}
}
}
__资料__
AAAAAAAAA
CCCCC
bbbbbbbbbbbbbbbbbbbb

@{$hash{$sequence}
谢谢Chas。欧文斯。回答得好。
my $out_seq = splice @{ $hash{$sequence} }, rand @{ $hash{$sequence} }, 1;
delete $hash{$sequence} unless @{ $hash{$sequence} };
#!/usr/bin/perl

use strict;
use warnings;

use strict;
use warnings;

# open my $in, '<', '/path/to/file') or die $!;
my $in = \*DATA; #use internal data file instead for testing
my $count = 0;

my %hash = (
    AAAAA    => [ "QWERT", "YUIOP" ],
    BBBBB    => [ "ASDFG", "HJKL", "ZXCVB" ],
);

while (<$in>) {
    chomp;
    my $hash;
    my @elements = split "\t";
    my $number = grep exists $hash{$_}, @elements;
    #open my $out, '>', "/path/out/Cluster__Number$._$number.txt" or die $!;
    my $out = \*STDOUT; # likewise use STDOUT for testing
    for my $sequence (@elements) {
        if (exists $hash{$sequence}) {
            my $out_seq = shift @{ $hash{$sequence} };
            # if you want to repeat
            push @{ $hash{$sequence} }, $out_seq;
            # if you want to remove $sequence when they run out
            # delete $hash{$sequence} unless @{ $hash{$sequence} };

            print $out ">$sequence\n$out_seq\n";
        } else {
            warn "Key [$sequence] Doesn't Exist ", ++$count, "\n";
        }
    }
}

__DATA__
AAAAA   AAAAA
CCCCC
BBBBB   BBBBB   BBBBB