Perl置換演算子で変数補間を無効にするにはどうすればよいですか。

StackOverflow https://stackoverflow.com//questions/12678519

  •  12-12-2019
  •  | 
  •  

質問

VMのテキストファイル内の特定の行を交換しようとしています。通常、これはPerlを持つ単純なワンライナーです。しかし、交換側がVMSパスを含むシンボルであったときに問題になりました。これがファイルで、私が試したものです:

File1.txtの内容:

foo
bar
baz
quux
.

3行目に置き換えようとしました:

$ mysub = "disk$data1:[path.to]file.txt"
$ perl -pe "s/baz/''mysub'/" file1.txt
.

次の出力を得ます:

foo
bar
disk:[path.to]file.txt
quux
.

Perlが過剰なように見え、パスの$data1部分を存在しない変数の内容(すなわち、何もない)に置き換えられました。デバッガを使って実行してそれを確認しました。私は/eを提供しませんでしたので、PerlがテキストをAS-ISに置き換えるだけです。それをするためにPerlを得る方法はありますか?

(Linuxコマンドラインで同様の動作を再現できます。)

役に立ちましたか?

解決

引用符と二重引用符をちょうどそこに入ることができる:

「文字列」+ '代替シンボル' + "String"の厳密な連結を作成します。 2つの二重引用符付き文字列には、代替品の一重引用符が含まれています。 対戦しました...しかしそれはうまくいきます。

$ perl -pe "s'baz'"'mysub'"'" file1.txt
.

それはDCLレベルの解です。

Perlソリューションの場合は、q()演算子を使用しないでください。 シンプルなDCLの置き換えを使用して、シンボルをPRANに詰め込みます。 これは私のお気に入りです(ほとんど)私にとって理にかなっていて、引用符で混乱しないではありません。

$ perl -pe "s/baz/q(''mysub')/e" file1.txt
.

他のヒント

は数十年にVMSシステムを見たことさえしていませんが、...あなたのシギルを脱出しますか?

$ mysub = "disk\$data1:[path.to]file.txt"
.

または多分

$ mysub = "disk\\$data1:[path.to]file.txt"
.

shまたは派生物の場合は、を使います

perl -pe'BEGIN { $r = shift(@ARGV) } s/baz/$r/' "$mysub" file1.txt
.

それ以外の場合は、Perl文字列リテラルへのmysubの値をどういうわけか隠す必要があります。それはより複雑になるでしょう。あなたのシェルの同等のものを見つけます。

op:

はい、これは機能します。VMがです

perl -pe "BEGIN { $r = shift(@ARGV) } s/baz/$r/" 'mysub' file1.txt
.

$を使用して\$をエスケープする必要があります。それ以外の場合、Perlは変数参照を見て、正規表現が評価される前にString $data1$data1の内容に置き換えます。$data1を定義しなかったので、もちろん空です。

次のコードを使用できます。

$ mysub='disk\$data1:[path.to]file.txt'
$ perl -pe 's/baz/'$mysub'/' FILE
foo
bar
disk$data1:[path.to]file.txt
quux
.

DCLシンボルの代わりに論理名を使用してみてください。

$ define mysub "disk$data1:[path.to]file.txt"
$ $ perl -pe "s/baz/mysub/" file1.txt
.

使用しています。

SEDは$data1を変数として補間しようとしないので、必要なものを手に入れるべきです。

$ sed -e "s/baz/''mysub'/" file1.txt
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top