perl hash:运算符预期的错误

时间:2016-11-19 19:45:14

标签: perl hash key operators

我创建了一个哈希,其中键是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;))**

感谢您的帮助。

3 个答案:

答案 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;