繁体   English   中英

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

[英]Perl Regex string replacement is not recognizing underscores in a string

我正在尝试使用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;

如果我只是尝试删除下划线,那将不起作用。 任何帮助将是巨大的!

谢谢

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM