Вот тебе первый примерчик:
Код
#!/usr/bin/perl
print "Directory to list: ";
$dir = <STDIN>;
chomp $dir;
opendir D, $dir or die "$dir: unable to open directory";
$i = 0;
while ($t = readdir D) {
$names[$i] = $t;
$times[$i] = $stat[10] if @stat = stat "$dir/$t";
$i++;
}
closedir D;
for ($i = 0; $i < @names; $i++) {
if (!$times[$i]) {
$time = "?";
} else {
@_ = localtime $times[$i];
$time = sprintf "%4d-%02d-%02d", $_[5] + 1900, $_[4], $_[3];
}
printf "%10s %s\n", $time, $names[$i];
}
Проблема при чтении строк из STDIN в том, что в конец незаметно добавляется "\n". С этим приходится бороться с помощью функции chomp.
Сортировка массива - функция sort. Сложные структуры данных и их сортировка - отдельная песня, т. к. связана с использованием ссылок (man perlref).
Добавлено через 11 мин. Вот более сложный пример с использованием ссылок и сортировки по указанному условию:
Код
#!/usr/bin/perl
print "Directory to list: ";
$dir = <STDIN>;
chomp $dir;
opendir D, $dir or die "$dir: unable to open directory";
$i = 0;
while ($name = readdir D) {
if (@stat = stat "$dir/$name") {
$ctime = $stat[10];
}
else {
$ctime = 0;
}
$list[$i++] = { 'name' => $name, 'ctime' => $ctime };
}
closedir D;
@list = sort {uc($$a{'name'}) cmp uc($$b{'name'})} @list;
foreach $file (@list) {
if (!$$file{'ctime'}) {
$time = '?';
} else {
@_ = localtime $$file{'ctime'};
$time = sprintf "%4d-%02d-%02d", $_[5] + 1900, $_[4], $_[3];
}
printf "%10s %s\n", $time, $$file{'name'};
}
@list - это массив ссылок на хеши (ассоциативные массивы Perl). В данном случае реализуется аналогия массива указателей на структуры. Сортировка выполняется над ссылками, но сравнение при этом происходит по одному из элементов хеша.
Вообще, аппарат ссылок Perl - очевидно, мощное, но трудное для интуитивного понимания средство. Оно отдает низкоуровневым программированием.