Perl Regex字符串替换无法识别字符串中的下划线

时间:2019-01-18 15:01:23

标签: regex perl

我正在尝试使用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 :(得分:2)

问题是您的目录名称包含下划线。因此,当您从$_删除所有下划线时,请更改目录的名称,然后move()会尝试将重命名的文件移到(大概)不存在的重命名目录中。

一种解决方案是使用File::Basename$_拆分为目录名和文件名,并且仅更改文件名。

另一种解决方案是在调用$dir之前将目录更改为glob()(然后从传递给$dir/的参数中删除glob())。

您可能已经看到问题所在,是检查了move()的返回值并显示了相应的错误消息。

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

还请注意,通过在调用$orig之前打印出$_move(),您可能会a)可能看到问题所在,并且b)意识到该问题无关使用Perl的字符串替换(如您所见,替换成功完成)。当然,这是基本的调试实践,至少可以避免(至少)您发布标题完全误导的问题:-)