【发布时间】:2011-12-22 07:24:03
【问题描述】:
类似于this,如何在 Perl 中实现相同的功能?
我要转换:
C:\Dir1\SubDir1\` to `C:/Dir1/SubDir1/
我正在尝试遵循here 给出的示例,但是当我说类似的话时:
my $replacedString= ~s/$dir/"/"; # $dir is C:\Dir1\SubDir1\
我得到一个编译错误。我尝试转义/,但随后出现其他编译器错误。
【问题讨论】:
类似于this,如何在 Perl 中实现相同的功能?
我要转换:
C:\Dir1\SubDir1\` to `C:/Dir1/SubDir1/
我正在尝试遵循here 给出的示例,但是当我说类似的话时:
my $replacedString= ~s/$dir/"/"; # $dir is C:\Dir1\SubDir1\
我得到一个编译错误。我尝试转义/,但随后出现其他编译器错误。
【问题讨论】:
您正在拆分 =~ 运算符并缺少全局修饰符。只需将$dir 分配给$replacedString,然后进行替换即可。
my $replacedString = $dir;
$replacedString =~ s|\\|/|g;
您也可以使用转换运算符tr 代替s 运算符以获得更简单的代码。
my $replacedString = $dir;
$replacedString =~ tr|\\|/|;
【讨论】:
= ~ 与 =~ 非常不同。第一个是赋值和按位否定,第二个是与正则表达式一起使用的绑定运算符。
你想要的是这个:
$string_to_change =~ s/pattern_to_look_for/string_to_replace_with/g;
注意使用全局/g 选项来更改整个字符串。在你的情况下,看起来你需要:
$dir =~ s/\\/\//g;
如果你想要一个更易读的正则表达式,你可以交换分隔符:s#\\#/#g;
如果您想保留原始字符串,可以在替换之前复制它。你也可以使用音译:tr#\\#/#——在这种情况下你不需要全局选项。
简而言之:
$dir =~ tr#\\#/#;
文档:
【讨论】:
您实际上可能正在寻找File::Spec->canonpath 或Path::Class 而没有意识到。
【讨论】:
use warnings;
use strict;
my $str = 'c:/windows/';
$str =~ tr{/}{\\};
print $str;
输出:
c:\windows\
【讨论】: