【问题标题】:Perl errors: Can't use string (" ") as a HASH ref while "strict refs" in use at Test.pl line "n", <File> line 2Perl 错误:在 Test.pl 行“n”、<File> 第 2 行使用“strict refs”时,不能使用字符串(“”)作为 HASH ref
【发布时间】:2017-08-20 09:48:59
【问题描述】:

我目前正在编写一个将文件作为输入的脚本。输入文件如下所示:

ECHANTILLON GENOTYPE    
CAN1        genotype1   
CAN2        genotype1   
CAN3        genotype1   
EUG1        genotype2   
EUG2        genotype2   
EUG3        genotype2   
EUG4        genotype2

我想做的是创建一个哈希:

  • 作为 GENOTYPE 列的第一个键和
  • 名为“sample”的第二个键将指向“ECHANTILLON”列。因此,它的值将给出例如 CAN1、CAN2...

这是我的脚本的样子:

#!/usr/local/perl-5.24.0/bin/perl
use warnings;
use strict;

use Data::Dumper;
use feature qw{ say };
use Getopt::Long; 



my $list_geno;

GetOptions("g|input=s"=>\$list_geno);
my %hash_geno_group;

open(GENOTYPED,"<$list_geno") or die ("Cannot open $list_geno\n");
while (defined(my $l1= <GENOTYPED>)) 
    {
        my @geno_group_infos = split(m/\t/,$l1); 
        next if ($l1 =~ m/^ECHANTILLON/); 
        chomp($l1);
        my $sample_nm = $geno_group_infos[0]; 
        my $sample_geno_group = $geno_group_infos[1]; 
        push @{ $hash_geno_group{$sample_geno_group}{"sample"} },$sample_nm;
        foreach $sample_geno_group (keys (%hash_geno_group)){
            foreach $sample_nm (values %{$hash_geno_group{%{$sample_geno_group}{"sample"}}}){
            print $sample_geno_group, "\t" ,  $sample_nm, "\n";
}
}
}


close(GENOTYPED);
exit;

我试图检查返回 $sample_nm 变量的打印结果,但它返回我作为错误

Can't use string ("genotype1") as a HASH ref while "strict refs" in use at Test.pl line 27, "GENOTYPED" line 2". 

谁能解释一下:

  • 为什么我有这种类型或错误;
  • 如何从第一列获取值。我需要进一步将它们存储到另一个变量中,以便将它们与相同的值进行比较,但来自另一个输入文件。 谢谢 !

【问题讨论】:

  • 它也没有27行。
  • 第 27 行是哪一行?
  • 第 27 行是打印的那一行。

标签: perl hash strict refs


【解决方案1】:

换行

foreach $sample_nm (values %{$hash_geno_group{%{$sample_geno_group}{"sample"}}}){

foreach $sample_nm (@{$hash_geno_group{$sample_geno_group}{"sample"}}){

$sample_geno_group 是哈希%hash_geno_group 的键,即。一个字符串(在您的示例中为genotype1genotype2)。但是当您执行%{$sample_geno_group} 时,您正在取消引用它,就好像它是一个哈希引用,因此出现错误Can't use string as HASH ref ...

此外,values %{ xxx } 应该用于检索xxx 引用的哈希值。但在您的情况下,xxx(即$hash_geno_group{$sample_geno_group}{"sample"})是对数组的引用,您在其中插入带有push ... 上面两行的元素。所以应该使用@{ xxx } 来检索它的元素(正如我在我建议的修复中所做的那样)。


另一个建议:使用用my 声明的变量,而不是你的裸词GENOTYPED(例如open my $genotype, '&lt;', $list_geno or die "Can't open '&lt;$list_geno': $!")。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2014-01-18
    • 1970-01-01
    • 2012-04-13
    • 2023-03-14
    相关资源
    最近更新 更多