ls -ltr в perl - PullRequest
       28

ls -ltr в perl

1 голос
/ 11 августа 2010

Я хочу повторить команду ls -ltr unix в perl-скрипте без использования обратных галочек, exec или system.Работает следующий скрипт:

use strict;
my $dir="/abc/xyz/log";
opendir(DIR, $dir) or die "Can not open $dir $!";
my @latest = (sort {-M $b <=> -M $a} <$dir/*>);
my @latest2= grep { !/^\./ && -f "$_"} @latest;
closedir DIR;

Вопрос: Как мне объединить sort и grep в одну строку, чтобы я мог покончить с @ latest2?

Ответы [ 5 ]

10 голосов
/ 11 августа 2010

Решения, представленные здесь, уже в порядке. но, вероятно, может работать медленно, если используется в очень большом каталоге, функция сортировки будет многократно применять -M к одним и тем же файлам снова и снова Следовательно, можно использовать преобразование Шварца , чтобы избежать этого (при необходимости):

...

my @sorted_fnames =
         map  $_->[0]       ,          # ↑ extract file names
         sort { $a->[1] <=> $b->[1] }  # ↑ sort ascending after mdate 
         map  [$_, -M $_]   ,          # ↑ pre-build list for sorting 
         grep ! /^\.\.?$/   ,          # ↑ extract file names except ./..
      readdir $dirhandle;              # ↑ read directory entries

...

Привет

БВУ

2 голосов
/ 11 августа 2010

my @latest = grep { !/^\./ && -f "$_"} (sort {-M $b <=> -M $a} <$dir/*>);

1 голос
/ 11 августа 2010

Как это:

my @latest = grep { !/^\./ && -f "$_"} (sort {-M $b <=> -M $a} <$dir/*>);
0 голосов
/ 11 августа 2010

Unix ls был реализован в Perl как часть Perl Power Tools (ls) .

Многие другие команды Unix также реализованы.

0 голосов
/ 11 августа 2010

Конвейерные команды Perl следуют в направлении справа налево от оператора присваивания. Таким образом, вы должны думать назад. Это операция, которая выполняется ближе всего к знаку равенства, что это было сделано первым.

Конечно, теперь для меня это вторая натура, что я редко думаю о том, какими "бэквордами" это может показаться. Однако, если вы сначала выполните grep, а затем сортируете, у вас будет более сжатая сортировка, и, поскольку лучшие сортировки полуквадратичные, уменьшение количества элементов, которые вы собираетесь сортировать, имеет большой смысл.

Поскольку ручки закрываются, когда они выходят из области видимости, вы можете просто сделать это:

my @list 
    = sort {-M $b <=> -M $a} 
      grep { !/^\./ && -f "$_"} 
      <$dir/*>
    ;

Поскольку для этого вы используете glob , вам не нужно открывать дескриптор каталога. Но если бы вы были, вы можете сделать это так:

my @list = sort ... grep ... 
           do { opendir( my $dh, $dir ) or die "Cannot open '$dir': $!"; 
                readdir( $dh ) 
              };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...