我有一个在 Windows 上存储路径的变量。我想将路径中的所有 \ 替换为 / 。
例如。$path = C:\Users\scripts.ps1
我是 Perl 的新手并尝试过类似的东西
$path = s/\\////
但它没有用。你能帮帮我吗....
我有一个在 Windows 上存储路径的变量。我想将路径中的所有 \ 替换为 / 。
例如。$path = C:\Users\scripts.ps1
我是 Perl 的新手并尝试过类似的东西
$path = s/\\////
但它没有用。你能帮帮我吗....
如果您想要一种跨平台的方式来执行此操作,请使用File::Spec。
($volume,$directories,$file) = File::Spec->splitpath( $path );
@dirs = File::Spec->splitdir( $directories );
然后用catpath
它来加入它。
你的尝试几乎是正确的。让我们仔细看看:
$path = s/\\////
^
首先,要对$path
变量进行替换操作,您需要使用=~
绑定运算符,而不仅仅是普通的赋值运算符。接下来,由于您使用惯用的斜线字符作为替换分隔符,所以上面指示的斜线实际上标志着替换命令的结束,其余两个斜线只是垃圾。看起来您可能认为绕过字符特殊属性的规则是将其加倍。如果您唯一的示例是反斜杠,那么该规则可能有意义,但该规则实际上是在特殊字符前加上反斜杠。用反斜杠替换突出显示的斜杠,它成为转义字符,所以我们绕过下一个斜线的特殊功能,将其视为普通斜线,允许后面的斜线正确终止替换:
$path =~ s/\\/\//
但这很难阅读。幸运的是,您不需要使用斜杠作为替换分隔符;你可以使用几乎任何你想要的字符。选择一个与您尝试替换的文本不相似的分隔符,您的代码可以更具可读性。详细信息在Quote 和 quote-like operator下的perlop中。当您选择的字符与另一个字符形成一对时,您可以使用两者来包围表达式的两个部分。此外,由于您可能想要替换字符串中的所有斜杠,因此您应该在末尾使用修饰符,告诉它全局匹配而不是在第一次替换后停止。把它们放在一起:g
$path =~ s{\\}{/}g
由于您将单个字符替换为另一个单个字符,因此您可以使用更专业的音译运算符tr
而不是s
. 它会自动全局应用。
$path =~ tr{\\}{/}
最后,如果这不仅仅是一次性路径操作(即,您在脚本中多次执行此操作,或者脚本将被维护一段时间),或者您需要您的代码在多个平台上运行相同,考虑使用File::Spec模块。它允许您使用正确的分隔符来拆分和连接路径组件,以适用于您正在运行的任何平台。
对于某些品种,我们还可以提及tr
运营商
$path =~ tr!\\!/!;
或者
$path =~ y!\\!/!;
将\
用/
in替换所有实例$path
$path =~ s/\\/\//g;
g
末尾的替换了每次出现的\
而不是仅替换第一次出现。
如果您使用不同的模式分隔符,则不需要转义正斜杠:
$path =~ s!\\!/!g;