【问题标题】:Can't use string as a symbol ref while "strict refs" in use使用“严格引用”时不能使用字符串作为符号引用
【发布时间】:2018-04-08 07:02:50
【问题描述】:

我正在尝试比较两个大文件并将包含相同内容的每一行与“Mus musculus”写入一个新文件。我的代码是:

#!/usr/bin/perl

use warnings;
use strict;

my $infile1 = "geneIDs3_MouseToUniProtAccessions.txt";
my $inFH1;
unless (open ($inFH1, "<", $infile1)){
    die join (' ', "can't open", $infile1, "for reading", $!);
}
my @list1 = <$inFH1>;
shift @list1;
close $inFH1;

my @list1_new;
for ($a = 0; $a < scalar @list1; $a++){
    if ($list1[$a] =~ /(.*Mus musculus.*)/){
        push @list1_new, $1;
    }
}

my $infile2 = "affymetrixIDs_MouseToUniProtAccessions.txt";
my $inFH2;
unless (open ($inFH2, "<", $infile2)){
    die join (' ', "can't open", $infile2, "for reading", $!);
}
my @list2 = <$inFH2>;
shift @list2;
close $inFH2;

my @list2_new;
for ($a = 0; $a < scalar @list2; $a++){
    if ($list2[$a] =~ /(.*Mus musculus.*)/){
        push @list2_new, $1;
    }
}

my @list = ("");
for ($a = 0; $a < scalar @list1_new; $a++){
    for ($b = 0; $b < scalar @list2_new; $b++){
        if ($list1_new[$a] eq $list2_new[$b]){
            push @list, $list1_new[$a];
        }
    }
}

unless (open (@list, ">", "match_1.txt")){
    die join (' ', "can't write the common interest");
}

运行后,perl 给我一个错误声明Can't use string ("1") as a symbol ref while "strict refs" in use at match_for_part_III_9.pl line 47.

有人知道怎么解决吗?任何建议将不胜感激。

【问题讨论】:

  • 第 47 行是哪一行?我没心情在屏幕上眯着眼数数。
  • unless (open (@list, "&gt;", "match_1.txt")){
  • 一方面,您尝试使用@list 的标量表示作为最后一次open 调用的文件句柄。错了。
  • 我想你想要的是open my $fh, '&gt;', 'match_1.txt'; print $fh @list;。这将是一个面对面的时刻。 :)
  • 您可能还想在Code Review 上发布该代码,有一些事情可以改进以使您的代码更具可读性。如果你有兴趣,那就是。其中一些包括使用$a$b,它们是为sort 保留的全局变量。此外,您的@list 将始终包含一个空行。

标签: perl


【解决方案1】:

您正在尝试使用 @list 的标量表示作为文件句柄来打开 match_1.txt 以便在第 47 行写入。

#             VVVV
unless (open (@list, ">", "match_1.txt")){
    die join (' ', "can't write the common interest");
}

相反,您想创建一个新的文件句柄,并将 print 您的 @list 指向该句柄。

open my $fh, '>', 'match_1.txt' or die "Can't write the common interest: $!";
print $fh @list; # will join on $\ implicitly
close $fh;

【讨论】:

  • 好的,这似乎是问题所在。但是,在我尝试将代码的最后一部分修改为my $inFH; @list1_new = &lt;$inFH&gt;; unless (open ($inFH, "&gt;", "match_1.txt")){ die join (' ', "can't write the common interest"); } 后,它给了我一个新错误Use of uninitialized value $inFH in &lt;HANDLE&gt; at match_for_part_III_9.pl line 54. readline() on unopened filehandle at match_for_part_III_9.pl line 54.
  • @WenjiaZhai 为什么要重用一个文件句柄,其名称显然是为了阅读?你为什么要从一个为写入而打开的文件句柄中读取?您的问题中不包含第 54 行,所以我只能猜测。
  • 这是一个新的文件句柄。我想用这个文件句柄来写,但我不知道如何将值放入文件句柄。
  • 谢谢!问题解决了。我没有意识到这是解决方案。
猜你喜欢
  • 2023-03-31
  • 2020-05-22
  • 2017-05-25
  • 2020-02-21
  • 2015-06-18
  • 1970-01-01
  • 2022-01-15
  • 2016-12-11
相关资源
最近更新 更多