【问题标题】:Perl substitution to change file pathPerl 替换以更改文件路径
【发布时间】:2012-07-05 08:56:19
【问题描述】:

我对此很生气,我正在尝试更改代码中显示的目录路径,但它不起作用,我做错了什么?

我希望 $fulltitle\\mynas\data\music\FABRICLive\17 - Rhodes For D - Furney.mp3

my $find = 'C:\Users\Bell';
my $replace = '\\mynas\data\music';
my $fulltitle = 'C:\Users\Bell\FABRICLive\17 - Rhodes For D - Furney.mp3';
$fulltitle =~ s/$find/$replace/;
print ("$fulltitle\n");

【问题讨论】:

标签: perl substitution


【解决方案1】:

quotemeta

use warnings;
use strict;

my $find      = quotemeta 'C:\Users\Bell';
my $replace   = '\\mynas\data\music';
my $fulltitle = 'C:\Users\Bell\FABRICLive\17 - Rhodes For D - Furney.mp3';
$fulltitle =~ s/$find/$replace/;
print("$fulltitle\n");

__END__

\mynas\data\music\FABRICLive\17 - Rhodes For D - Furney.mp3

warnings 会为您提供有关问题所在的线索。

【讨论】:

  • 非常感谢,我以前从未听说过quotemeta,所以感谢您提供的知识:)
【解决方案2】:

用正则表达式操作路径很糟糕。

use Path::Class::Dir qw();
use Path::Class::File qw();
my $old = Path::Class::Dir->new_foreign('Win32', 'C:\Users\Bell');
my $new = Path::Class::Dir->new_foreign('Win32', '\\\\mynas\data\music');
my $file = Path::Class::File->new_foreign('Win32', 'C:\Users\Bell\FABRICLive\17 - Rhodes For D - Furney.mp3');
$file->relative($old)->absolute($new)->stringify
# '\\mynas\data\music\FABRICLive\17 - Rhodes For D - Furney.mp3'

您在使用UNC path 的目录符号中犯了一个错误。字符串文字中的双反斜杠必须用反斜杠转义,这就是the syntax 的工作原理。

【讨论】:

    【解决方案3】:
    my $find      = 'C:\Users\Bell';
    my $replace   = '\\mynas\data\music';
    my $fulltitle = 'C:\Users\Bell\FABRICLive\17 - Rhodes For D - Furney.mp3';
    
    $fulltitle    =~ s/\Q$find\E/${replace}/;
    print "$fulltitle\n";
    

    您需要使用\Q\E 来禁用匹配中的反斜杠元字符。
    Codepad Example


    注意:替换会将\\ 转换为\

    【讨论】:

      猜你喜欢
      • 2013-07-17
      • 2014-07-13
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 1970-01-01
      相关资源
      最近更新 更多