2014-01-18 2 views
1

Я пытаюсь подсчитать, сколько раз DE10 и каждый из ключей в моем хеше ICD10 происходит в той же строке в моем файле2.tsv. Мне также нужно разделить его на мужчину/женщину (M/K). Поэтому я сделал хэш, получивший название. Каждый из ключей в этом назван в честь ключа в хеше ICD10, и они ссылаются на массив из двух элементов, первый подсчет самца, второй - подсчет самки.Проблемы с ссылками на массивы в perl

Но я получаю это предупреждение:

Can't use string ("0") as an ARRAY ref while "strict refs" 

благодаря этой линии:

$results{$key}[1] +=1; 

Я немного слаб на этой опорной части, кто-то может помочь мне с моей ошибки? спасибо

#!/usr/bin/perl -w 
use strict; 

################### 
# loading my hash # 
################### 

my %icd10; 

open(IN, '<', 'myfile.tsv') or die; 
while (defined (my $line = <IN>)) { 
chomp $line; 
$icd10{$line} = 1; 
} 
close IN; 

################ 
### COUNTING 
################# 

my %results; 

open(IN, '<', 'myfile2.tsv') or die; 
while (defined (my $line = <IN>)) { 
chomp $line; 
my @line = split('\t', $line); 
my %hash; 
for (my $i = 2; $i < scalar(@line); $i++){ 
    $hash{$line[$i]} = 1; 
} 

if (grep (m/^DE10/, keys %hash)) { 
    foreach my $key (keys %icd10){ 
     if (grep (m/^$key/, keys %hash)) { 
      if (exists $results{$key}) { 
       if ($line[1] eq 'M') { 
        $results{$key}[1] +=1; 
       } 
       elsif ($line[1] eq 'K'){ 
        $results{$key}[2] +=1; 
       } 
      } 
      else{ 
       if ($line[1] eq 'M') { 
        $results{$key}=(1,0); 
       } 
       elsif ($line[1] eq 'K'){ 
        $results{$key}=(0,1); 
       } 
      } 
+0

Скобки в этих двух предложениях '$ results {$ key} = (1,0);' и '$ results {$ key} = (0,1);' должны быть скобками, если вы хотите '$ results {$ key} 'для ссылки на массив. –

+0

Является ли эта строка опечаткой 'if (grep (m/^ DE10, keys% hash)) {'? Это должно быть 'if (grep (/^DE10 /, keys% hash)) { ' – Toto

+0

M42: извините, это была ошибка копирования. – user2335015

ответ

2

Если вы хотите $results{$key} быть ссылкой на массив, то скобки в этих двух идентичных предложениях $results{$key}=(1,0); должны быть квадратными скобками, например: $results{$key}=[1,0];.

Чтобы создать ссылку на массив, вы можете использовать обратный косой оператор:

$arrayref = \@array; 

Чтобы создать ссылку на анонимный массив, вы должны использовать квадратные скобки:

$arrayref = [ 'ele1', 'ele2' ]; 

См perlref для дальнейшего Детали.

+0

Хорошо, я действительно был бы глуп, но я не уверен, что мне нужно изменить. если я пишу $ results {$ key} = [1,0]; У меня все еще такая же проблема. – user2335015

+0

Я не уверен, что вы подразумеваете под скобками – user2335015

+0

@ user2335015 Измените оба '$ results {$ key} = (1,0);' to '$ results {$ key} = [1,0];' не работает? –

Смежные вопросы