2

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

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

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

$path = s/\\////

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

4

5 回答 5

10

如果您想要一种跨平台的方式来执行此操作,请使用File::Spec

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

然后用catpath它来加入它。

于 2010-05-04T11:54:29.153 回答
6

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

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

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

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

但这很难阅读。幸运的是,您不需要使用斜杠作为替换分隔符;你可以使用几乎任何你想要的字符。选择一个与您尝试替换的文本不相似的分隔符,您的代码可以更具可读性。详细信息在Quote 和 quote-like operator下的perlop中。当您选择的字符与另一个字符形成一对时,您可以使用两者来包围表达式的两个部分。此外,由于您可能想要替换字符串中的所有斜杠,因此您应该在末尾使用修饰符,告诉它全局匹配而不是在第一次替换后停止。把它们放在一起:g

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

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

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

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

于 2010-05-04T13:29:58.620 回答
4

对于某些品种,我们还可以提及tr运营商

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

或者

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

\/in替换所有实例$path

于 2010-05-04T09:11:50.300 回答
3

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

g末尾的替换了每次出现\而不是仅替换第一次出现。

于 2010-05-04T08:47:40.683 回答
3

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

$path =~ s!\\!/!g;
于 2010-05-04T08:50:23.713 回答