Regex Perl替换

Regex Perl替换,regex,perl,substitution,Regex,Perl,Substitution,我有一个在Windows上存储路径的变量。我想用/替换路径中的所有\ 例如,$path=C:\Users\scripts.ps1 我是Perl新手,尝试过类似的方法 $path = s/\\//// 但它不起作用。你能帮我一下吗……$path=~s/\\/\///g 结尾处的g将替换\的每次出现,而不仅仅是 第一个。如果使用不同的模式分隔符,则无需转义正斜杠: $path =~ s!\\!/!g; 对于某些种类,我们还可以提到tr操作符 $path =~ tr!\\!/!; 或 将用$pa

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

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

我是Perl新手,尝试过类似的方法

$path = s/\\////

但它不起作用。你能帮我一下吗……

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

结尾处的
g
将替换
\
的每次出现,而不仅仅是
第一个。

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

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

对于某些种类,我们还可以提到
tr
操作符

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


将用
$path

中的
/
替换
\
的所有实例如果需要跨平台方法,请使用


然后使用
catpath
将其重新加入。

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

$path = s/\\////
             ^
首先,要使替换操作在
$path
变量上进行,您需要使用,而不仅仅是普通赋值运算符。接下来,因为您使用了习惯的斜杠字符作为替换分隔符,所以上面所示的斜杠实际上标志着替换命令的结束,剩下的两个斜杠只是垃圾。看起来您可能认为,传递字符的特殊属性的规则是将其加倍。如果您唯一的示例是反斜杠,那么该规则可能有意义,但该规则实际上是在特殊字符前面加上反斜杠。将突出显示的斜杠替换为反斜杠,它将成为转义字符,因此我们绕过下一个斜杠的特殊函数,将其视为普通斜杠,允许后面的斜杠正确终止替换:

$path =~ s/\\/\//
但这很难理解。幸运的是,您不需要使用斜杠作为替换分隔符;你可以使用任何你想要的角色选择一个与您试图替换的文本不相似的分隔符,您的代码将更具可读性。详情见下表。当您选择的字符与另一个字符形成一对时,可以使用这两个字符将表达式的两个部分括起来。此外,由于您可能希望替换字符串中的所有斜杠,因此应该在末尾使用
g
修饰符,告诉它全局匹配,而不是在第一次替换后停止。把这一切结合起来:

$path =~ s{\\}{/}g
由于要用一个字符替换另一个字符,因此可以使用更专业的而不是
s
。它自动在全球范围内应用

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

最后,如果这不仅仅是一个一次性路径操作(即,您在脚本中多次执行此操作,或者脚本将被维护一段时间),或者您需要代码在多个平台上运行相同的操作,请考虑使用模块。它允许您在运行的任何平台上使用正确的分隔符拆分和连接路径组件。

如果您使用
,将更加清晰
#
{}
分隔符。它还可以避免额外的反斜杠。我想这取决于个人偏好……实际上,正确的答案取决于你为什么要这样做。所以正确的答案可能是“不要这样做”。@Rob:s//
的全局匹配如何?谢谢,@Zaid。自由地做任何你想要的其他改进;这就是为什么我把我的答案标记为社区维基。(也因为我的答案只是其他四个答案的总结。)
$path =~ s{\\}{/}g
$path =~ tr{\\}{/}