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