Как я могу заставить работать это дезинфицирующее средство OneDrive? - PullRequest
0 голосов
/ 01 апреля 2019

Я учусь кодировать, следуя учебным пособиям, чтобы попытаться решить проблему, которая раздражала - очистить файлы в macOS, чтобы они не мешали работе OneDrive.

Я следовал нескольким учебникам ион почти делает то, на что я надеюсь.

#!/usr/bin/perl -w
use strict;
use warnings;
use File::Find;

my @argv;
my $dir = $ARGV[0];

find(\&dirRecurs, $dir);

sub dirRecurs{

    if (-f and not 's/^\./' )
    {
        (my $txt = $_) =~ s/^\ | (?=\.)|[\/!#%^?*&()\\]| $//g;
        rename($_, $txt);
    }

}

Я ожидал, что это исключит .dotfiles из процесса переименования в результате and not 's/^\./', но это не так.Если я уберу and not 's/^\./' из строки if, все будет работать так, как я надеюсь, за исключением

Я ожидал \/ в регулярном выражении для переименования файлов, таких как more/less.pdf, но это не

1 Ответ

0 голосов
/ 01 апреля 2019

Соответствующая строка кода:

if (-f and not 's/^\./' )
  • Это успешно, когда -f верно и 's/^\./' ложно
    • -f проверяет, является ли $_ файлом
    • В логическом контексте 's/^\./' проверяет, является ли данная строка ненулевой

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

Глядя на содержимое строки, становится ясно, что целью было вставить тест регулярного выражения. Требуется форма m// («матч»). Тот, который был (почти) предоставлен, является искаженной версией s/// (поиск и замена).

В Perl регулярные выражения обычно не отображаются в виде строк. Соответствующая форма (m необязательна):

if (-f and not m/^\./)

Как пара сторон:

  • @argv не используется в вашем коде (и не совпадает с @ARGV)
  • используйте find(\&dirRecurs, @ARGV); для поиска более одного пути (предоставляется в качестве аргументов скрипту perl)
  • Вы выполняете переименование, даже если никаких изменений не было. Этого можно избежать, включив и if:
if ((my $txt = $_) =~ s/^\ | (?=\.)|[\/!#%^?*&()\\]| $//g) {
    rename($_, $txt);
}

# or:

rename($_, $txt)
    if (my $txt = $_) =~ s/^\ | (?=\.)|[\/!#%^?*&()\\]| $//g;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...