Замена строки в Perl Regex не распознает подчеркивания в строке - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь переименовать несколько файлов, используя Perl и Regex. До сих пор я мог изменить большинство вещей, но у меня проблемы с удалением подчеркивания. Я искал и нашел несколько примеров, все с похожим синтаксисом, но по какой-то причине это не работает для меня.

Вот пример того, как выглядят мои имена файлов:

HP_1 Уровень 1 Geology_Plan_1_400dpi.jpg

Вот мой код:

#  Declare directory path
my $dir = './Georeferenced_Images.tri/TEST/';

#  Initialization message
printf "Changing names...\n";

#  Remove spaces
my @list = glob("$dir/*");
for (@list) {
      my $orig = $_;
      s/\s+//g;
      move($orig, $_);  
}

#  Remove underscores
@list = glob("$dir/*");
for (@list) {
      my $orig = $_;
      s/_//g;
      move($orig, $_);  
}

Верхняя часть кода удаляет пробелы. Вторая часть кода не удаляет подчеркивания. Я поиграл с кодом, и он работает, если я делаю что-то вроде:

s/_Plan_//g;

Это не сработает, если я просто попытаюсь снять подчеркивание. Любая помощь будет отличной!

Спасибо

1 Ответ

0 голосов
/ 18 января 2019

Проблема в том, что имя вашего каталога содержит подчеркивание. Поэтому, когда вы удаляете все подчеркивания из $_, вы изменяете имя каталога и move() пытается переместить переименованный файл в переименованный каталог, который (предположительно) не существует.

Одним из решений является использование File :: Basename для разделения $_ на имя каталога и имя файла и только для изменения имени файла.

Другим решением было бы изменить каталог на $dir перед вызовом glob() (и затем удалить $dir/ из параметра, который вы передаете glob()).

Возможно, вы видели, в чем проблема, вы проверили возвращаемое значение move() и отобразили соответствующее сообщение об ошибке.

move($orig, $_)
  or die "Could not move $orig to $_: $!";

Также обратите внимание, что, распечатав $orig и $_ перед вызовом move(), вы бы а) вероятно увидели, в чем проблема, и б) поняли, что проблема не имеет ничего общего с заменой строки в Perl (как Вы бы увидели, что замена была проведена успешно). Это, безусловно, базовая практика отладки, которая позволила бы избежать (по крайней мере) публикации вопроса с полностью вводящим в заблуждение названием: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...