English 中文(简体)
如何将S/A{/LB/纳入S-{EXPR}e?
原标题:How to embed s/A{/LB/ in the EXPR of s{...}{EXPR}e?
  • 时间:2024-03-01 21:48:39
  •  标签:
  • regex
  • perl

I ve read Quote and Quote-like Operators in man perlop but can t figure out how to use s/.../EXPR/e if EXPR contains code which itself contains a substitution involving both A and the outer substitution delimiters:

perl -E  say "{foo}" =~ s{.+}{local $_=$&; s/{/LB/;$_ }er; 

页: 1

如果我尝试使用<代码>。 A

perl -E  say "{foo}" =~ s{.+}{local $_=$&; s/A{/LB/;$_ }er; 

reg reg reg

Adding additional backslashes before A does not help.

在<代码>{之前添加斜线 似乎也没有工作:

perl -E  say "{foo}" =~ s{.+}{local $_=$&; s/A\{/LB/;$_ }er; 

查阅<代码>替代物,但不终止<>/代码>(合理足够),但

perl -E  say "{foo}" =~ s{.+}{local $_=$&; s/A\{/LB/;$_ }er; 

汇编但并不匹配(产出为{foo}而不是LBfoo})。

在“未终止”的错误与无声不匹配之间添加斜线。

谁会发现问题?

问题回答

您需要逃避<代码>{(或任何其他划界人),因为您想在外部替代中使用该编码。 但是,你也需要逃脱,因为需要从内部替代中逃脱。 不幸的是,Perl确实没有能够改变神经替代品的越狱性质,因此你可以这样做。

如何引证各种东西,例如Q:

perl -E  say "{foo}" =~ s{.+}{local $_=$&; s/AQ{E/LB/;$_ }er; 

(此处不需要<代码>E)

Or, use an x escape:

perl  -E  say "{foo}" =~ s{.+}{local $_=$&; s/Ax7b/LB/;$_ }er;

或者,使用变量:

perl -E  $lb = "\{"; say "{foo}" =~ s{.+}{local $_=$&; s/A$lb/LB/;$_ }er; 

Using a character class works, too:

perl -wE  say "{foo}" =~ s{.+}{local $_=$&; s/A[{]/LB/;$_ }er; 

甚至转载于<代码>/x,并通过空间帮助将其分离:

perl -E  say "{foo}" =~ s{.+}{local $_=$&; s/A {/LB/x;$_ }er; 

我尝试用<代码>-Mre=debug操作单行人,以了解有关内容,而Perl报告A{,而不是A{>/code>。 有趣的是,<条码><<<>><>><>>>>>/代码>导致罚款。

perl -wE  say "{foo}" =~ s{.+}{local $_=$&; s/^{/LB/;$_ }er; 

请注意,如果其他限制者在reg鱼体内重新排出特殊位置(他们也不与“^”合作),即存在同样的问题。

perl -wE  say "[foo]" =~ s[.+][local $_=$&; s/^[/LB/;$_ ]er;   # Error
perl -wE  say "(foo)" =~ s(.+)(local $_=$&; s/^(/LB/;$_ )er;   # Error
perl -wE  say "<foo>" =~ s<.+><local $_=$&; s/^</LB/;$_ >er;   # OK!

您的法典如下:

s{.+}{local $_=$&; s/A{/LB/;$_ }er

首先,应该将这一点简化到以下几个方面:

s{.+}{ $& =~ s/A{/LB/r }er;

第一件事 要做到这一点,就必须找到经营者的终点。 外部替代物的限值为{>>>,因此替换词中的{>/code>为 escaping a delimiter。 同样的,<代码>a”b“生成a”b, 您的替换表述如下:

 $& =~ s/A{/LB/r 

注:已到,因为它被用于逃避限制。

因此,我们保留了<代码>A{>,即为法律。 正因为如此,你的方案没有工作。 简单的解决办法是避免使用<代码>{>,代之以x7B

s{.+}{ $& =~ s/Ax7B/LB/r }er;

你也可以使用不同的限定词。

s<.+>< $& =~ s/A{/LB/r >er;

或者,还有你可以使用的 ha子。

s{.+}{ $& =~ s/^{/LB/r }er;     # Inner subst is `s/^{/LB/r`
s{.+}{ $& =~ s/A {/LB/xr }er;  # Inner subst is `s/A {/LB/xr`




相关问题
Why does my chdir to a filehandle not work in Perl?

When I try a "chdir" with a filehandle as argument, "chdir" returns 0 and a pwd returns still the same directory. Should that be so? I tried this, because in the documentation to chdir I found: "...

How do I use GetOptions to get the default argument?

I ve read the doc for GetOptions but I can t seem to find what I need... (maybe I am blind) What I want to do is to parse command line like this myperlscript.pl -mode [sth] [inputfile] I can use ...

Object-Oriented Perl constructor syntax and named parameters

I m a little confused about what is going on in Perl constructors. I found these two examples perldoc perlbot. package Foo; #In Perl, the constructor is just a subroutine called new. sub new { #I ...

Where can I find object-oriented Perl tutorials? [closed]

A Google search yields a number of results - but which ones are the best? The Perl site appears to contain two - perlboot and perltoot. I m reading these now, but what else is out there? Note: I ve ...

热门标签