2011-12-19 3 views
5

아래 코드에서 여러 열을 정렬하는 방법은 무엇입니까?여러 열 정렬 (Perl)

현재 코드 :
1. $directory
2에서 파일의 @list을 가져옵니다은의 3 개 값에서 @list
3. 인쇄의 각 요소에 대한 $fileName, $fileLocation$fileSize를 얻기 위해 정규식을 사용합니다
$fileName 1 : (2) (3) 고정 폭 열로 4.이어서으로 분류 표시하는 I는 출력하려는 ​​

총 파일 수 및 디렉토리의 크기를 출력 다음
다음
3. $fileSize

$directory = '/shared/tmp'; 
$count = 0; 

@list = qx{du -ahc $directory}; 

printf ("%-60s %-140s %-5s\n", "Filename", "Location", "Size"); 

foreach(@list) { 
    chop($_);              # remove newline at end 
    if (/^(.+?K)\s+(.+\/)(.+\.[A-Za-z0-9]{2,4})$/) {    # store lines with valid filename into new array 
# push(@files,$1); 
    $fileSize = $1; 
    $fileLocation = $2; 
    $fileName = $3; 
    if ($fileName =~ /^\./) { 
     next; } 
    printf ("%-60s %-140s %-5s\n", $fileName, $fileLocation, $fileSize); 
    $count++; 
    } 
    else { 
    next; 
    } 
} 

print "Total number of files: $count\n"; 

$total = "$list[$#list]"; 
$total =~ s/^(.+?)\s.+/$1/; 
print "Total directory size: $total\n"; 

답변

11

당신은 당신의 자신의 정렬 알고리즘을 지정하고 sort에게 줄 수 있습니다!


샘플 구현

@entries라는 배열로 (해시 참조)에 결과를 밀어하고, 아래와 같은 것을 사용

.

my @entries; 

... 

# inside your loop 

    push @entries, { 
    'filename' => $fileName, 
    'location' => $fileLocation, 
    'size'  => $fileSize 
    }; 

... 

my @sorted_entries = sort { 
    $a->{'filename'} cmp $b->{'filename'} || # use 'cmp' for strings 
    $a->{'location'} cmp $b->{'location'} || 
    $a->{'size'}  <=> $b->{'size'}  # use '<=>' for numbers 
} @entries;