2011-12-19 47 views
5

Làm cách nào để tôi sắp xếp trên nhiều cột cho mã bên dưới?Sắp xếp theo nhiều cột (Perl)

Hiện nay, mã:
1. Gets một @list của tập tin trong một $directory
2. Sử dụng regex để có được những $fileName, $fileLocation$fileSize cho mỗi phần tử trong @list
3. In ra 3 giá trị trong (2) thành 3 cột cố định chiều rộng 4. Sau đó in ra tổng số các tập tin và thư mục kích thước

tôi muốn đầu ra để hiển thị được sắp xếp theo:
1. $fileName sau đó
2. $fileLocation sau đó
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"; 

Trả lời

11

Bạn có thể chỉ định thuật toán phân loại của riêng bạn và đưa nó cho sort!


Một mẫu thực hiện

Đẩy kết quả của bạn (trong một tài liệu tham khảo băm) vào một mảng gọi @entries, và sử dụng một cái gì đó giống như dưới đây .

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; 
Các vấn đề liên quan