Perl替换

Mar*_*lin 2 regex perl substitution

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

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

我是Perl的新手,并试过类似的东西

$path = s/\\////
Run Code Online (Sandbox Code Playgroud)

但它没有用.你能帮帮我吗....

cod*_*lic 10

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

($volume,$directories,$file) = File::Spec->splitpath( $path );
@dirs = File::Spec->splitdir( $directories );
Run Code Online (Sandbox Code Playgroud)

然后用catpath它来加入它.


Rob*_*edy 6

你的尝试几乎是对的.让我们仔细看看:

$path = s/\\////
             ^
Run Code Online (Sandbox Code Playgroud)

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

$path =~ s/\\/\//
Run Code Online (Sandbox Code Playgroud)

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

$path =~ s{\\}{/}g
Run Code Online (Sandbox Code Playgroud)

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

$path =~ tr{\\}{/}
Run Code Online (Sandbox Code Playgroud)

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