동일한 파일에 쓰는 것에 대해서는 Vinko 응답을 참고하십시오.
my @arr1 = ("AA", "BB", "CC", "DD", "EE");
my %replacements = map { ($arr1[$_] => $_ + 1) } (0..$#arr1);
my $regexp = join('|', sort { length($b) <=> length($a) } @arr1);
open F2, $file;
while (<F2>) {
my $str = $_;
$str =~ s/($regexp)/$replacements{$1}/ge;
print $str;
}
close(F2);
중요 부품 :
my %replacements = map { ($arr1[$_] => $_ + 1) } (0..$#arr1);
그것은 @ arr1에서 키 해시를 구축하고, 값이 1 씩 증가 @ arr1에서 주어진 값의 인덱스입니다 문자열을 교체,이 조각을 확인하시기 바랍니다
예를 들어, @ arr1 = ("a", "b", "d", "c")의 경우; 대체율은 다음과 같습니다. ("a"=> 1, "b", => 2, "c"=> 4, "d"=> 3);
my $regexp = join('|', sort { length($b) <=> length($a) } @arr1);
이것은 @ arr1에서 모든 단어를 찾기위한 기본 정규 표현식을 구축합니다. 정렬 부분은 길이가 내림차순으로 단어를 정렬합니다. 그래서, @ arr1 = ("a", "ba", "bac") $ regexp는 'bac | ba | a'가됩니다.
이 순서는 다른 단어의 접두사가 될 경우 문제가 될 수 있으므로 중요합니다 (본 예에서는 "ba"및 "bac"와 같이).
마지막으로 말하자면 FH로 파일 핸들을 사용하는 것은 다소 실망 스럽습니다. 이러한 파일 핸들러는 전역이며, 좀 더 복잡한 프로그램에서 "흥미로운"문제를 생성합니다.대신 다음과 같이 공개 사용
open my $fh, 'filename';
또는 더 나은 아직 :
이
open my $fh, '<', 'filename';
Test :: More는 어떻게됩니까? –
Nathan : 작동 방식을 테스트합니다. –
@Nathan : Test :: 더 자세히 is() 함수를 가져 오시겠습니까? ;) 그러나 나는 당신과 동의합니다, 간단한 "인쇄 대체 ('AA BB CC DD');" 예를 들어, Test :: More는 아무 것도 추가하지 않습니다. – user55400