2

我先设置了一个环境变量 X。

> setenv X "abc 12_3 abc"

然后我在 perl 中编写了一个正则表达式,试图在 $2 中匹配第一列以及一个空格和剩余的字符串。在这里我打印第一场比赛 $1

> echo $X|perl -lne '$_=~m/([^\s]*[\s])(.*)/;print $1'
abc 

在这里,我打印第二场比赛 $2。

> echo $X | perl -lne '$_=~m/([^\s]*[\s])(.*)/;print $2'
12_3 abc

到目前为止,看起来一切都很好。现在我想将第二场比赛中的所有下划线替换为空格

> echo $X | perl -lne '$_=~m/([^\s]*[\s])(.*)/;$2=~s/_/ /g;'
Modification of a read-only value attempted at -e line 1, <> line 1.

好吧,错误消息说 $2 是只读的。那很好。所以我将 $2 复制到一些临时变量 $temp。因此,在复制其罚款时,$1 和 $2 仍然存在,如下所示:

> echo $X | perl -lne '$_=~m/([^\s]*[\s])(.*)/;$temp=$2;print $1.$2'
abc 12_3 abc

现在我尝试用临时字符串 $temp 中的空格替换下划线。

> echo $X | perl -lne '$_=~m/([^\s]*[\s])(.*)/;$temp=$2;$temp=~s/_/ /g;print $1.$2'

> 

我的问题是 1 美元和 2 美元去哪儿了?即使我对 $temp 进行了更改,如果它更改了 2 美元,至少 1 美元发生了什么?

4

2 回答 2

10

该语句$temp=~s/_/ /g重置匹配变量;所以如果你想在新的匹配/替换之后使用 then ,你必须将 then 存储在一个变量中......

于 2013-01-03T12:30:00.467 回答
1

s/_/ /g成功了,并且它不包含捕获,因此它将所有捕获变量设置为 undef。

此代码将执行您想要的操作:

perl -nle'($x,$y)=/^(\S*\s+)(.*)/; $y =~ s/_/ /g; print $1.$2;'

甚至:

perl -ple's/^\S*\s+\K(.*)/ ($x=$1) =~ s{_}{ }g; $x /e;'

甚至(5.14+):

perl -ple's/^\S*\s+\K(.*)/ $1 =~ s{_}{ }gr /e;'
于 2013-01-03T17:24:10.863 回答