Perl: используйте s / (replace) и возвращайте новую строку - PullRequest
26 голосов
/ 09 августа 2010

В Perl оператор s/ используется для замены частей строки. Теперь s/ изменит свой параметр (строку) на месте. Однако я хотел бы заменить части строки перед ее печатью, как в

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

Есть ли такая функция replace в Perl или каким-либо другим способом сделать это? s/ не будет работать напрямую в этом случае, и я бы хотел избежать использования вспомогательной переменной. Есть ли способ сделать это in-line?

Ответы [ 5 ]

61 голосов
/ 09 августа 2010

Не проверено:

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'
3 голосов
/ 09 августа 2010

В Perl 5.14 и более поздних версиях вы можете использовать опцию /r с оператором подстановки для выполнения неразрушающего замещения :

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

В качестве альтернативы вы можете использовать блок do() с временной лексической переменной, например ::

print "bla: ", do { (my $tmp = $myvar) =~ s/a/b/; $tmp }, "\n";
2 голосов
/ 24 декабря 2012
print "bla: ", $myvar =~ tr{a}{b},"\n";
1 голос
/ 09 августа 2010
print "bla: ", $_, "\n" if ($_ = $myvar) =~ s/a/b/g or 1;
0 голосов
/ 10 августа 2010

Если вы действительно хотите, вы можете создать свой собственный, но я бы не стал, потому что у вас гораздо больше функциональности с 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;
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...