我创建了一个哈希,其中键是phred + 33 fastq文件的符号,值是相关的fastq分数。我在整个代码中遇到了很多与运算符有关的错误。代码运行正常,没有哈希部分。
以下是代码:
use warnings;
use strict;
open(IN, '<', '/path/to/in_file.txt') or die $!;
my @symbols;
my $count = 0;
my %hash = (
'!' => "0",
'"' => "1",
'#' => "2",
'$' => "3",
'%' => "4",
'&' => "5",
q(') => "6",
'(' => "7",
')' => "8",
'*' => "9",
'+' => "10",
',' => "11",
'-' => "12",
'.' => "13",
'/' => "14",
'0' => "15",
'1' => "16",
'2' => "17",
'3' => "18",
'4' => "19",
'5' => "20",
'6' => "21",
'7' => "22",
'8' => "23",
'9' => "24",
':' => "25",
';' => "26",
'<' => "27",
'=' => "28",
'>' => "29",
'?' => "30",
'@' => "31",
'A' => "32",
'B' => "33",
'C' => "34",
'D' => "35",
'E' => "36",
'F' => "37",
'G' => "38",
'H' => "39",
'I' => "40",
'J' => "41",
'K' => "42"
);
while(my $fastq = <IN>){
my $length = length $fastq;
if ($length < 4180){
next
}
my $substring = substr($fastq, 4175, 10);
push(@symbols, $substring);
}
foreach (@symbols) {
my @eachsymbol = split //, $_;
$count++;
print "Sequence ", $count, "\n";
foreach my $symbol (@eachsymbol) {
if (exists $hash{$symbol}){
print $hash{$symbol}, "\n";
}
}
}
作为参考,输入文件如下所示: !&#39;&#39; ((((的 的 +))%%% ++)(%%%%)1 * - + *&#39;&#39;))**
感谢您的帮助。
答案 0 :(得分:3)
每当您创建包含任何非单词字符(即不是0-9a-zA-Z_
)的哈希键时,您必须引用它们:
my $hash = (
';' => 1,
'*' => 2,
'!' => 'etc',
);
访问/使用它们时相同:
my $x = $hash{'!'};
此外,使用单引号时不会插入变量:
$hash{'$symbol'}
将其更改为:
$hash{"$symbol"};
......或更好:
$hash{$symbol};
答案 1 :(得分:2)
你有
''' => "6",
你的哈希定义中的是有问题的。您可以改为使用"'"
或q{'}
。
通过将%hash
定义为:
my %hash = qw(
! 0
" 1
# 2
$ 3
% 4
....
H 39
I 40
J 41
K 42
);
甚至更好:
my @sym = qw( ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K );
my %symmap = map +($sym[$_] => $_), 0 .. $#sym;
这将导致以下警告:
可能尝试将评论放入qw()列表......
和
可能尝试用逗号分隔单词......
这是因为qw
包含#
和,
个字符。您可以使用
no warnings 'qw';
在最小的适用范围内,如
my %symmap;
{
no warnings 'qw';
my @sym = qw( ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K );
%symmap = map +($sym[$_] => $_), 0 .. $#sym;
}
答案 2 :(得分:1)
要完成其他答案,请注意您可以使用ascii代码构建哈希(这样可以避免引用问题):
my %symmap = map { (chr($_), $_ - 33) } 33..75;