2012-02-27 6 views
0

저는 Perl을 처음 접했고 Perl 스크립트를 작성하고 있습니다. 내 스크립트의 일부는 각 단어가 텍스트 파일에 나타나는 횟수를 계산합니다. 이 카운팅은 특정 간격 후에 반복됩니다, 그래서 각 반복 서열을위한 배열이 필요합니다.. 나는 단어의 수를 세는 코드를 가지고있다. 그러나 단지 하나의 서열이있다.Perl에서 해시 배열 초기화

for (@array) { 
    $counts{$_}++; 
    print "\'$_\'\t"; 
} 

내 문제는 해시 "개수"에 대한 배열을 만들어야한다는 것입니다.

편집 : ARRAY로하면 텍스트 파일의 각 특정 섹션에 대한 각 단어의 반복을 저장할 수 있어야한다는 의미입니다. 나는 텍스트 파일에서 각 부분에 대한 부분적인 수를 결정해야한다. 이것이 내 텍스트 파일의 모습입니다.

i HAVE uploaded an image to describe in details

+0

"해쉬의 값을 하나씩 증가시킬 수있는 방법이 있습니까?"무엇을 의미합니까? 해시의 각 요소를 하나씩 늘리시겠습니까? "해시를위한 배열 만들기"? 해시를 배열에 넣고 싶습니까? 'push @list, \ % hash'? – Qtax

+1

맹 글링 전후에 예제 데이터를 제공하십시오. – daxim

+1

해시가 있고 배열이 있고 해시에 개수가 있지만 배열에없는 것으로 알고 있습니다. 하지만 그 후에 너는 나를 잃어 버렸다. 문제에 대한 해결책 (문제가 해결되지 않음)을 설명하는 대신 문제를 설명하는 것이 도움이 될 수 있습니다. – TLP

답변

2

펄의 좋은 점은 해시를 초기화 할 필요가 없습니다 것입니다 또는 배열을 만들면됩니다.

당신은 새로운 Perl 사용자라고하지만 참고 문헌에 대해 알고있는 것 같습니다. Perl documentation 안에 우수 tutorial을 바로 읽을 수 있습니다. 명령 줄에서 perldoc 명령을 사용하여이 작업을 수행 할 수 있습니다.

는 말했다 및 응용 프로그램을보고, 나는 데이터 구조의 여러 가지 유형을 볼 수

  • 해시의 배열 : 각 섹션 당신 '에 대한 배열이있을 것이다이 구조에서 다시 치고, 당신은 0에서 당신이 쳤던 최대치까지 섹션의 번호를 매길 것입니다. 해당 항목의 해시에 각 항목의 수를 저장합니다.

코드는 다음과 같을 것이다 : 각 매개 변수가 다른 섹션에 저장되도록

my $section_number = -1; #We'll increment this to one on the first section number 
my @data;     #This is an array where you'll store your sections 

while (my $line = <$my_file>) { 
    chomp $line; 
    if ($line =~ /^>this is my \w+ statement$/) { 
     $section_number++; 
     $data[$section_number] = {}; #A reference to a hash 
    } 
    else { 
     $data[$section_number]->{$line}++; 
    } 
} 

은 if 문의 첫 번째 부분은 단지 섹션의 수를 증가한다. 질문이 인 경우 좋음 섹션 #x에서 매개 변수 "y"를 몇 번 보았습니까?.

  • 배열의 해시

    :이 시간, 당신은 매개 변수의 트랙, 매개 변수가 나타나는지 다음 섹션을 유지하고 있습니다.이것은 위와 반대이지만 질문에 대답하는 데 유용합니다. 각 섹션에 "y"매개 변수가 몇 번 나타 났습니까?

코드는 다음과 같을 것이다 :

my $section_number = -1; #We'll increment this to one on the first section number 
my %data;     #This is an array where you'll store your sections 

while (my $line = <$my_file>) { 
    chomp $line; 
    if ($line =~ /^>this is my \w+ statement$/) { 
     $section_number++; 
    } 
    else { 
     if (not exists $data{$line}) { 
      $data{$line} = []; #This hash will contain a ref to an array 
     }   
     $data{$line}->[$section_number]++; 
    } 
} 

또 다른 가능성은 TLP을 보여 주었다 해시의 해시를 사용하는 것입니다.

요점은 단순한 스칼라 데이터 이상을 포함하는 구조에 대해 이야기 할 때 참조를 사용해야한다는 것입니다.

데이터 구조를 구성하려는 방법은 실제로 당신에게 달렸으며 추적하려는 대상과 데이터에 액세스하려는 방법에 따라 다릅니다. 이 질문에서 알 수 있듯이 데이터를 구성하는 데는 최소한 세 가지 방법이 있습니다. 그리고이 복잡한 데이터 구조를 만드는 것은 매우 쉽습니다. 그리고 초기화 할 것이 없습니다.

일단 참조를 이해하면 데이터 구조가 감히 복잡 할 수 있습니다 (실제로 야생화되기 전에 객체 지향 Perl 코딩 기술을 살펴 보는 것이 좋겠지 만).

그런데 아무 대답도 Data::Dumper을 사용하는 것 외에 데이터에 액세스하는 방법은 언급하지 않았지만 간단한 루프만으로 충분할 수 있습니다. 이것은 일련의 해시를위한 것입니다.

my $section = 0; 
while ($section <= $#data) { 
    my %param_hash = %{$data[$section]}; 
    foreach my $parameter (sort keys %param_hash) { 
     print "In section $section: $parameter appears $param_hash{$parameter} times\n"; 
    } 
    $section++; 
} 
1

나는 당신이 여기 요구하고 정확히 모르겠지만, 시작하는 좋은 방법은 단순히 해시에 모든 데이터를 추가 한 다음 해당 해시에서 필요한 데이터를 추출 할 수 아마도.

use strict; 
use warnings; 
use Data::Dumper; 

my %count; 
my $section; 
while (<DATA>) { 
    chomp; 
    if (/^section/) {  # some check to tell sections apart 
     $section = $_; 
    } else { 
     $count{$section}{$_}++; 
    } 
} 

print Dumper \%count;  # see what your structure looks like 
my @array = values %count; # if you don't like hashes 

__DATA__ 
section1 
param1 
param2 
param2 
param3 
section2 
param1 
param2 
param3 
param1 
section3 
param4 
param1 
param1 
param2 
section4 
param1 
param3 
+0

응답 해 주셔서 감사합니다. – NumbersInMyHead

0

단어 수의 익명 해시를 작성하십시오. 각 섹션의 끝에 해시를 배열에 푸시하고 새로운 익명 해시를 시작합니다. 아래의 코드는 이것을 구현합니다. (Data::Dumper에 대한 호출은 내장 된 데이터 구조를 보여 만있다.)

use strict; 
use warnings; 

my $sect; 
my @counts; 

while (<DATA>) { 
    if (/^(\w+)/) { 
    $sect->{$1}++; 
    } 
    elsif ($sect) { 
    push @counts, $sect; 
    undef $sect; 
    } 
} 

use Data::Dumper; 
$Data::Dumper::Sortkeys = 1; 
print Data::Dumper->Dump([\@counts], ['*counts']); 


__DATA__ 
-------------------- 
>this is my first statement 
Parameter1 
Parameter2 
Parameter3 
Parameter2 
-------------------- 
>this is my second statement 
Parameter1 
Parameter2 
Parameter3 
-------------------- 
>this is my third statement 
Parameter1 
Parameter2 
Parameter2 
Parameter3 
-------------------- 
>this is my fourth statement 
Parameter1 
Parameter2 
-------------------- 
>this is my fifth statement 
Parameter1 
Parameter2 
Parameter3 
Parameter4 
-------------------- 

OUTPUT

@counts = (
    { 
    'Parameter1' => 1, 
    'Parameter2' => 2, 
    'Parameter3' => 1 
    }, 
    { 
    'Parameter1' => 1, 
    'Parameter2' => 1, 
    'Parameter3' => 1 
    }, 
    { 
    'Parameter1' => 1, 
    'Parameter2' => 2, 
    'Parameter3' => 1 
    }, 
    { 
    'Parameter1' => 1, 
    'Parameter2' => 1 
    }, 
    { 
    'Parameter1' => 1, 
    'Parameter2' => 1, 
    'Parameter3' => 1, 
    'Parameter4' => 1 
    } 
); 
+0

답변 해 주셔서 감사합니다. – NumbersInMyHead