Ответы пользователя по тегу Perl
  • Нужна помощь с perl. Как правильно сделать?

    Можно так:

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    use POSIX qw/strftime/;
    
    my $src_dir = $ARGV[0];
    my $dst_dir = $ARGV[1];
    
    my $yesterday = strftime("%Y-%m-%d", localtime(time-86400));
    
    my @src_files = split /\s+/, `ls $src_dir`;
    
    for my $sf (@src_files){
        my $df = "$dst_dir/$sf-$yesterday";
        if ( ! -f $df  ){
            print "$df\n";
        }
    }


    Вызывать так:
    check_backup.pl /tmp/src_dir /tmp/dst_dir

    Если высокие требования к надежности скрипта -- стоит аккуратнее вызывать внешний ls (проверять, что он не упал).
    Ответ написан
  • Как удалить элемент из массива Perl по значению?

    Проблем даже несколько.
    Главная -- в grep'ах потерялись отрицания, и получается, что ищем элементы массива, у которых и первая, и вторая половинки равны одновременно и первой, и второй половинке эталонного (случайного) элемента. Таких никогда не находится.

    Вторая серьезная проблема: в функции adsp создается ссылка на анонимный массив ($arrset), который не возвращается из функции. Исходный же массив @arrset не модифицируется.

    Далее: rand возвращает вещественные числа, использовать их для доступа по индексу в массиве -- странновато (хотя и работает -- вещественные округляются).

    И наконец: ни одна переменная в фунции adsp не объявлена (my var), а значит, и use strict в скрипте не используется, т.е. perl не следит за тем, чтобы не использовались необъявленные переменные. В таких случаях обязательно появляются ошибки "присвоили одной переменной, а использовать пытаемся другую".

    Итого. По-моему, код должен был быть таким:

    sub adsp {
      my $rand = int rand @arrset;
      my $rand_num = $arrset[$rand];
      $rand_num =~ /^(\d+)_(\d+)$/;
      my $buf = $1;
      my $buf2 = $2;
    
      @arrset = grep { !/^\d+_$buf$/ } @arrset;
      @arrset = grep { !/^\d+_$buf2$/ } @arrset;
      @arrset = grep { !/^${buf}_\d+$/ } @arrset;
      @arrset = grep { !/^${buf2}_\d+$/ } @arrset;
      return $rand_num; 
    }


    Случайные индекс берется целый, модифицируется исходный массив @arrset, в grep'ах условия с отрицанием, все переменные объявлены лексическими (my).

    И обязательно используйте в каждом скрипте
    use strict;
    use warnings;

    -- это экономит много времени на отладке.
    Ответ написан
    Комментировать
  • Русскоязычные ресурсы по Perl?

    Вот еще новый список русскоязычных Perl-ресурсов на perlmaven.com: ru.perlmaven.com/pomosch
    Ответ написан
    Комментировать