web-dev-qa-db-ja.com

Perl:s /(置換)を使用して、新しい文字列を返します

Perlでは、演算子s/は、文字列の一部を置き換えるために使用されます。今s/は、そのパラメーター(文字列)を適切に変更します。ただし、次のように、印刷する前に文字列の一部を置き換えたい

print "bla: ", replace("a","b",$myvar),"\n";

Perlにそのようなreplace関数、またはそれを行う他の方法はありますか? s/はこの場合は直接機能しません。ヘルパー変数の使用を避けたいと思います。これをインラインで行う方法はありますか?

28
sleske

未テスト:

require 5.013002;
print "bla: ", $myvar =~ s/a/b/r, "\n";

Perl5132delta を参照してください:

置換演算子は、入力変数をコピーし、コピーで置換を実行して結果を返す/ rオプションをサポートするようになりました。オリジナルは変更されません。

my $old = 'cat';
my $new = $old =~ s/cat/dog/r;
# $old is 'cat' and $new is 'dog'
62
daxim

Perl 5.14以降を使用している場合、_/r_オプションを置換演算子とともに使用して、 非破壊置換を実行できます

_print "bla: ", $myvar =~ s/a/b/r, "\n";
_

以前のバージョンでは、一時的なレキシカル変数で do() ブロックを使用して同じことを実現できます。

_print "bla: ", do { (my $tmp = $myvar) =~ s/a/b/; $tmp }, "\n";
_
4
Eugene Yarmash
print "bla: ", $myvar =~ tr{a}{b},"\n";
2
Ali Mohammadi
print "bla: ", $_, "\n" if ($_ = $myvar) =~ s/a/b/g or 1;
1
unbeli

本当に必要な場合は、独自に作成できますが、s/// ...その機能を関数に組み込むこともできますが、なぜ既存のものを再作成するのですか?

#!/usr/bin/Perl -w    

use strict;     

   main();   

   sub main{    
      my $foo = "blahblahblah";          
      print '$foo: ' , replace("lah","ar",$foo) , "\n";  #$foo: barbarbar

   }        

   sub replace {
      my ($from,$to,$string) = @_;
      $string =~s/$from/$to/ig;                          #case-insensitive/global (all occurrences)

      return $string;
   }
0
vol7ron