2

最初に環境変数 X を設定します。

> setenv X "abc 12_3 abc"

次に、最初の列とスペースを一致させ、残りの文字列も $2 に一致させようとする正規表現を perl で作成しました。ここでは、最初の一致 $1 を出力します

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

ここでは、2 番目の一致 $2 を出力します。

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

今のところ、見た目はすべて問題ありません。今、2番目の一致のすべてのアンダースコアをスペースに置き換えることを考えました

> 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 はどこに行ったのですか? $2 を変更した場合に $temp に変更を加えたにもかかわらず、少なくとも $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 に答える