Perl替换

时间:2010-05-04 08:47:08

标签: regex perl substitution

我有一个在Windows上存储路径的变量。我想用路径中的/替换所有\。

例如。 $path = C:\Users\scripts.ps1

是Perl的新手并尝试了类似

的内容
$path = s/\\////

但它没有用。你可以帮帮我....

5 个答案:

答案 0 :(得分:10)

如果您想要一种跨平台的方法,请使用File::Spec

($volume,$directories,$file) = File::Spec->splitpath( $path );
@dirs = File::Spec->splitdir( $directories );

然后使用catpath将其加入。

答案 1 :(得分:6)

你的尝试几乎是正确的。让我们仔细看看:

$path = s/\\////
             ^

首先,要对$path变量进行替换操作,您需要使用=~ binding operator ,而不仅仅是普通赋值运算符。接下来,由于您使用了惯用的斜杠字符作为替换分隔符,因此上面指示的斜杠实际上标记了替换命令的 end ,其余两个斜杠只是垃圾。看起来您可能认为绕过角色的特殊属性的规则是将其加倍。如果您的唯一示例是反斜杠,那么该规则可能有意义,但规则实际上是使用反斜杠为特殊字符添加前缀。用反斜杠替换突出显示的斜杠,它变为转义字符,因此我们绕过下一个斜杠的特殊函数将其视为普通斜杠,允许斜杠后正确终止替代:

$path =~ s/\\/\//

但这很难读。幸运的是,你不是必需使用斜杠作为替换分隔符;你可以使用你想要的任何角色。 选择与您要替换的文字不相似的分隔符,您的代码可以更具可读性。详细信息位于Quote and quote-like operators下的 perlop 中。当您选择的字符与另一个字符形成一对时,您可以使用两者来包含表达式的两个部分。此外,由于您可能希望将所有替换为字符串中的斜杠,因此最后应使用g修饰符,告诉它匹配全局在第一次替换后停止。将所有这些结合在一起:

$path =~ s{\\}{/}g

由于您将单个字符替换为另一个字符,因此您可以使用更专业的 transliteration operator tr 而不是s。它会自动全局应用。

$path =~ tr{\\}{/}

最后,如果这不仅仅是一次性路径操作(即,您在脚本中多次执行此操作,或者脚本将保留一段时间),或者您需要代码在多个平台,考虑使用File::Spec模块。它允许您使用正确的分隔符分割和连接路径组件,无论您正在运行什么平台。

答案 2 :(得分:4)

对于某些种类,还可以提及tr运算符

$path =~ tr!\\!/!;

$path =~ y!\\!/!;

会将\的所有实例替换为/

中的$path

答案 3 :(得分:3)

$path =~ s/\\/\//g;

最后g替换 {/ 1}}的每个,而不是仅 第一个。

答案 4 :(得分:3)

如果使用不同的模式分隔符,则无需转义正斜杠:

$path =~ s!\\!/!g;