Perl Split Long Substitution Regex over Multiple Lines

问题描述 投票:0回答:1

我在Perl正则表达式中有一个很长的替换字符串,我想将其分成多行。将长替换字符串拆分成多行的语法是什么?我尝试了以下操作,但没有成功(不忽略空格):

$var =~ s/(some)(thing)/A_very_long_string_with_many_characters_that_should_be_split_over_
          multiple_lines_but_can't_be_for_whatever_reason._The_matching_groups_are_"$1"_and_"$2"/x;

我的regex替换字符串比这个人为的示例交错得多,所以我不能只将较大的文字部分放入变量中。换句话说,以下内容对我来说是not有用的:

my $prefix = 'A_very_long_string_with_many_characters_that_should_be_split_over_' .
             'multiple_lines_but_can\'t_be_for_whatever_reason._The_matching_groups_are_';
$var =~ s/(some)(thing)/$prefix"$1"_and_"$2"/;

有人知道将替换字符串分割成多行的方法吗?

perl line-breaks substitution
1个回答
2
投票

s///运算符的替换组件不是正则表达式,并且不受/x修饰符的影响。它是一个字符串,类似于用双引号引起来的字符串或反引号的内容。唯一的选择是将其构造为像您提到的变量一样,或应用/e修饰符,这会将替换内容转换为perl表达式,您可以在其中构造字符串,但由于裸字字符串而需要用引号引起来严格禁止。

use strict;
use warnings;
$var =~ s/(some)(thing)/'A_very_long_string_with_many_characters_that_should_be_split_over_' .
      qq{multiple_lines_but_can't_be_for_whatever_reason._The_matching_groups_are_"$1"_and_"$2"}/e;

2
投票

替换面是一个字符串,需要接受一些特定的修饰符。当替换侧被评估为代码时,一种不同的情况是/e。但是,如果它是纯字符串,则它的求值方式不受(any?)修饰符的影响,并且不受/x的影响,因为空格在字符串中计数。

如果使用/e,则可以根据需要在替换端编写代码,然后可以逐段形成替换字符串。

一种方法是使用sub来整齐地组织/e下替换字符串的构建

$var =~ s/(some)(thing)/build_repl($1, $2)/e;

sub build_repl {
    my ($c1, $c2) = @_;
    return 
        qq(A_very_long...) .
        qq(The_matching...$c1...$c2);
}
© www.soinside.com 2019 - 2024. All rights reserved.