2013-07-09 5 views

답변

26

-n 명령 줄 옵션이

while ($ARGV = shift @ARGV) { 
    open ARGV, $ARGV; 
    LINE: while (defined($_ = <ARGV>)) { 
    $seen{$_} .= @ARGV; 
    print $_ if $seen{$_} =~ /10$/; 
    } 
} 

에 상응하는 뭔가를 코드 변환, scalar @ARGV1입니다. 각 행에 대해 1%seen 항목에 추가됩니다.

두 번째 파일을 읽는 동안 scalar @ARGV0입니다. 따라서 파일 1과 파일 2에 행이있는 경우 항목은 1110000 (파일 1에서는 3x, 파일 2에서는 4x)이었습니다.

공통 라인 만 정확하게 한 번 출력하고 싶습니다. 공통 줄이 file2에서 처음 보일 때 이것을 수행하므로 $seen{$_}1110입니다. 정규식 /10$/으로 표시됩니다. 문자열 10이 끝에 와야합니다.

+1

멋진 종합 답변! 파일이 처리 될 때'@ ARGV'가 변경된다는 것을 알지 못했습니다. 따라서 '% 표시된'해시는 항목이 할당 될 때 존재하게됩니다. 해시 항목의 기본값은 무엇입니까? 빈 문자열입니까? – Kelvin

+2

@Kelvin 여전히 상당한 양의 마법이 여기에 있습니다. 더 큰 프로그램에서, 하나는'strict'를 사용하고 루프 밖에서'% hash "로"my % hash "를 선언합니다. 해쉬 엔트리가 존재하지 않으면 그 값은'undef' (다른 언어에서는'null' 또는'nil')입니다. 그러나 항목이 문자열로 처리되면 빈 문자열입니다. 따라서 그것은 내가 의미하는 바를 수행한다. – amon

+1

데이터 구조 (해시, 배열)의 값이 존재할 때이를 [* autovivification *] (https://en.wikipedia.org/wiki/Autovivification)라고합니다. 이는 특히 복잡한 데이터 구조 또는 그러한 계산 요소를 만드는 데 유용합니다. 예 : 'my % hash; $ hash {foo} {bar} = 42'는'foo' 항목에서 해쉬를 자동으로 초기화합니다. – amon

3

첫 번째 파일을 열 때 @ARGV가 이동합니다. 스칼라 컨텍스트에서는 1을 반환합니다 (두 번째 파일에 멤버가 하나 있기 때문에). 각 행에 대해이 1이 표시된 해시 %에 추가됩니다. 두 번째 파일이 열리면 @ARGV가 다시 이동하고 이제 비어 있으므로 스칼라 컨텍스트에서 0을 반환합니다. /10$/은 "file1에서 라인이 보였으 나 이제는 file2에서 처음 발견되었습니다"라는 의미입니다. 첫 번째 파일을 읽을되는 동안

관련 문제