簡體   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