원본을 유지하면서 문자열에 대해 Perl 대체를 어떻게 수행합니까?

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

  •  09-06-2019
  •  | 
  •  

문제

Perl에서 정규식을 사용하여 문자열을 대체하고 원본을 변경하지 않고 값을 다른 변수에 저장하는 좋은 방법은 무엇입니까?

저는 보통 문자열을 새 변수에 복사한 다음 이를 변수에 바인딩합니다. s/// 새 문자열을 대체하는 정규식을 사용하고 있지만 이를 수행하는 더 좋은 방법이 있는지 궁금합니다.

$newstring = $oldstring;
$newstring =~ s/foo/bar/g;
도움이 되었습니까?

해결책

이것은 원본을 변경하지 않고 문자열의 수정된 복사본을 얻는 데 항상 사용했던 관용구입니다.

(my $newstring = $oldstring) =~ s/foo/bar/g;

Perl 5.14.0 이상에서는 새로운 기능을 사용할 수 있습니다. /r 비파괴 대체 수정자:

my $newstring = $oldstring =~ s/foo/bar/gr; 

메모:위의 솔루션은 없이도 작동합니다. g 도.또한 다른 수정자와도 작동합니다.

다른 팁

성명서:

(my $newstring = $oldstring) =~ s/foo/bar/g;

이는 다음과 같습니다.

my $newstring = $oldstring;
$newstring =~ s/foo/bar/g;

또는 Perl 5.13.2부터 다음을 사용할 수 있습니다. /r 비파괴적인 대체를 수행하려면 다음을 수행하십시오.

use 5.013;
#...
my $newstring = $oldstring =~ s/foo/bar/gr;

아래에 use strict, 말하다:

(my $new = $original) =~ s/foo/bar/;

대신에.

한 줄짜리 솔루션은 좋은 코드보다 shibboleth로 더 유용합니다.좋은 Perl 코더라면 그것을 알고 이해하겠지만, 시작하는 두 줄의 복사 및 수정 쌍보다 훨씬 덜 투명하고 읽기 쉽습니다.

즉, 이를 수행하는 좋은 방법은 다음과 같습니다. 이미 그것을하고 있습니다.가독성을 희생하면서 불필요한 간결함은 승리가 아닙니다.

또 다른 5.14 이전 솔루션: http://www.perlmonks.org/?node_id=346719 (Japhy의 게시물 참조)

그의 접근 방식은 map, 배열에도 잘 작동하지만 계단식 연결이 필요합니다. map 임시 배열을 생성하려면(그렇지 않으면 원본이 수정됩니다):

my @orig = ('this', 'this sucks', 'what is this?');
my @list = map { s/this/that/; $_ } map { $_ } @orig;
# @orig unmodified

나는 foo와 bar를 싫어합니다 ..어쨌든 프로그래밍에서 이렇게 설명적이지 않은 용어를 생각해낸 사람은 누구입니까?

my $oldstring = "replace donotreplace replace donotreplace replace donotreplace";

my $newstring = $oldstring;
$newstring =~ s/replace/newword/g; # inplace replacement

print $newstring;
%: newword donotreplace newword donotreplace newword donotreplace

Perl을 다음과 같이 작성한다면 use strict;, 선언된 경우에도 한 줄 구문이 유효하지 않다는 것을 알게 될 것입니다.

와 함께:

my ($newstring = $oldstring) =~ s/foo/bar/;

당신은 다음을 얻습니다:

Can't declare scalar assignment in "my" at script.pl line 7, near ") =~"
Execution of script.pl aborted due to compilation errors.

대신, 한 줄 더 길지만 사용하고 있는 구문이 구문상으로 올바른 방법입니다. use strict;.나를 위해 use strict; 이제는 습관일 뿐입니다.나는 그것을 자동으로한다.모두가 그래야 합니다.

#!/usr/bin/env perl -wT

use strict;

my $oldstring = "foo one foo two foo three";
my $newstring = $oldstring;
$newstring =~ s/foo/bar/g;

print "$oldstring","\n";
print "$newstring","\n";
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top