2011-02-16 7 views
1

나는이 내 디렉토리에있는 모든 파일을 나열이 코드 :배열에 비슷한 요소가 있는지 어떻게 알 수 있습니까?

같은 것을 포함하는 배열 반환
$dir = '/var/www/corpIDD/rawFile/'; 
opendir DIR, $dir or die "cannot open dir $dir: $!"; 
my @file= readdir DIR; 
closedir DIR; 

: 나는 요소를 저장하는 방법을 여기

$array (0 => 'ipax3_2011_01_27.txt', 1 => 'ipax3_2011_02_01.txt', 2 => 'ipax3_2011_02_03.txt') 

내 문제를, 1 => 'ipax3_2011_02_01.txt'및 2 => 'ipax3_2011_02_03.txt'를 사용하여 동일한 월 및 연도 (2011_02)에 속한 변수를 구분할 수 있습니까?

감사합니다.

+0

시도해 보았습니다. 배열 요소에서 패턴 "year_month"를 검색했습니다. $ search = $ year. "_". $ this_month; @match = grep (/ $ search/i, @file); 하지만 이번 달의 파일 만 검색합니다. 내 디렉토리에서 같은 달에 두 개 이상의 항목을 가진 파일을 찾을 무언가가 필요합니다. –

답변

3

데이터 구조에서 문자열을 키로 사용해야하는 경우 % sigil로 지정된 HASH 내장 유형을 찾고 있습니다. Perl 해시의 멋진 기능 중 하나는 복잡한 데이터 구조를 미리 선언 할 필요가 없다는 것입니다. 당신은 그것을 사용할 수 있고 Perl은 그 사용법으로부터 구조를 추론 할 것입니다.

 
2011_01 has 1 file 
2011_02 has 2 files 

은 개별 파일에서 가져 오려면 :

my @file = qw(ipax3_2011_01_27.txt ipax3_2011_02_01.txt ipax3_2011_02_03.txt); 

my %ipax3; 

for (@file) { 
    if (/^ipax3_(\d{4}_\d{2})_(\d{2}).txt$/) { 
     $ipax3{$1}{$2} = $_ 
    } 
    else { 
     warn "bad file: $_\n" 
    } 
} 

for my $year_month (keys %ipax3) { 
    my $days = keys %{ $ipax3{$year_month} }; 
    if ($days > 1) { 
     print "$year_month has $days files\n"; 
    } 
    else { 
     print "$year_month has 1 file\n"; 
    } 
} 

인쇄하는

my $year_month = '2011_02'; 
my $day  = '01'; 
my $file  = $ipax3{$year_month}{$day}; 

내가 반복하는 목록 모두 같은 keys 함수의 반환 값을 사용 위하고, 일 수. keys은 목록 컨텍스트에있을 때 모든 키를 반환하고 스칼라 컨텍스트에서 키 수를 반환하기 때문에 가능합니다. 문맥 주위의 코드에 의해 제공된다

마지막 예에서
my $number = keys %ipax3; # number of year_month entries 

my @keys = keys %ipax3; # contains ('2011_01', '2011_02') 

my @days = keys %{ $ipax{$year_month} }; 

%ipax 각 해시 값에 대한 참조이다. keys은 문자 해시를 취하므로 $ipax{$year_month}%{ ... }에 넣어야합니다. perl v5.13.7 +에서는 keys 및 다른 몇 가지 데이터 구조 액세스 함수에 대한 인수를 중심으로 %{ ... }을 생략 할 수 있습니다.

+0

와우! 그것은 위대한 sooo입니다! Im perl에 초보자 그래서 나는이 기능의 많은 것을 몰랐다. 고맙습니다. –

1

사람들은 정말 빠른 응답을 보이고 있습니다. :) 어쨌든, 나는 내 의견을 게시 할 것입니다. 기본적으로 해시를 사용하고 있습니다.

use warnings qw(all); 
use strict; 

my ($dir, $hdir) = 'C:\Work'; 
opendir($hdir, $dir) || die "Can't open dir \"$dir\" because $!\n"; 
my (@files) = readdir($hdir); 
closedir($hdir); 

my %yearmonths; 
foreach(@files) 
{ 
    my ($year, $month); 
    next unless(($year, $month) = ($_ =~ /ipax3_(\d{4})_(\d{2})/)); 
    $year += 0; 
    --$month;   #assuming that months are in range 1-12 
    my $key = ($year * 12) + $month; 
    ++$yearmonths{ $key }; 
} 
foreach(keys %yearmonths) 
{ 
    next if($yearmonths{ $_ } < 2); 
    my $year = $_/12; 
    my $month = 1 + ($_ % 12); 
    printf "There were %d files from year %d, month %d\n", $yearmonths{$_}, $year, $month; 
} 
+0

감사! 그것들은 또한 위대했다! –

관련 문제