【问题标题】:How to substitute sequential spaces individually in perl如何在perl中单独替换顺序空格
【发布时间】:2014-03-04 11:31:26
【问题描述】:

我想用“\ ”替换“a   b”中的每个空格,并且预期的输出是“a\ \ \ b”。
我尝试了以下代码,但输出不满意。

#!usr/bin/perl -w
use CGI;
my $q = CGI -> new;
print $q -> header();
$input = "a   b";
(my $output = $input) =~ s/\ /\\ /;

输出是“a\   b”,但不是“a\ \ \ b”。
我怎样才能做到正确?

【问题讨论】:

  • 使用s/\/\\ /g;中的g标志
  • tr 适合此任务。 tr/ /\\/ 空格也不需要转义,但是替换/音译中的反斜杠会。
  • 为什么人们以 cmets 的形式给出答案? not OP 没有可供选择的答案,我必须在未回答的问题搜索中继续看到它。

标签: perl substitution


【解决方案1】:

$input = "a   b";

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

测试有效,我的测试代码

#!/usr/bin/perl

$abc = "a          b";

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

print $abc, "\n";

Cerberus:~ alexmac$ ./testaaa.pl
a\\\\\\\\\\b

这应该很适合您。我们的想法是我们正在匹配 \s,它会一遍又一遍地匹配,直到您匹配任何 \s 类型的字符,即空白字符集 regular expressions

【讨论】:

    【解决方案2】:

    首先,正如前面的回答者已经提到的那样,您只是在替换正则表达式中缺少 /g(“全局”)修饰符。

    alex@yuzu:~$ perl -E '$str = "a   b"; $str =~ s/ /\\ /g; say $str;'
    a\ \ \ b
    

    但是更进一步,我想知道您是否希望转义除空格以外的字符。在这种情况下,您可能需要考虑使用 quotemeta() 内置函数。

    alex@yuzu:~$ perl -E '$str = q{a   b   ()+?$@%}; say quotemeta $str;'
    a\ \ \ b\ \ \ \(\)\+\?\$\@\%
    

    欲了解更多信息,请参阅perldoc quotemeta

    【讨论】:

    • 我认为你的答案是最好的,但你的例子很难阅读。我会放弃提示内容,只使用带有 cmets 的代码进行输出。这样他们就会突出显示正确
    猜你喜欢
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    相关资源
    最近更新 更多