我有一个在Windows上存储路径的变量。我想用路径中的/替换所有\。
例如。 $path = C:\Users\scripts.ps1
是Perl的新手并尝试了类似
的内容$path = s/\\////
但它没有用。你可以帮帮我....
答案 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;