[英]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.