2013-03-12 1 views
2

입력을 위해 파일을 열었으므로 불쾌한 작은 버그가 생겼습니다. XML :: Writer를 사용했기 때문에 일어났습니다. 축복 된 IO :: 핸들 참조 또는 출력 (또는 스칼라 참조, 그러나 여기서는 중요하지 않습니다)을위한 파일 핸들을 사용할 수 있습니다. 내부적으로 XML :: Writer는 ->print을 사용하여 출력 참조를 사용합니다.Perl IO :: 핸들 경고 동작

print은 입력 용으로 만 열린 파일 핸들에서 호출 할 수 있으며 IO :: Handle은 전혀 경고하지 않기 때문에 문제가 발생했습니다. 설명 할 코드는 다음과 같습니다.

open my $out, '<', 'out.txt'; 
say $out 'testing';   # warns, "Filehandle opened only for input" 
$out->print('testing');  # doesn't do anything?! 

open my $out2, '>', 'out2.txt'; 
$out2->print('testing'); # works fine 

여기에 어떤 현상이 발생합니까? 이 예상되는 동작입니까? 나는 IO :: 클래스를 많이 사용하지 않는다. 그래서 나는 단지 오해하고있다. 선명도

편집 :

위의 코드는 확실히 하나의 경고 (2 호선)을 생산하고 있습니다. 3 호선에서도 경고가 나올 것 같지만 그렇지 않습니다. $out에 아무것도 인쇄하지 않으며, 경고하지 않습니다. 단지 자동으로 실패합니다 (잘못된 것 같습니다). 3 호선은 가지고있는 Perl의 버전에 대해 경고를 내지 않습니다 : 5.8, 5.10, 5.16.

+0

어떤 버전의 Perl과'IO :: Handle'을 가지고 있습니까? Perl 5.14.2에서 경고 메시지가 나타납니다. – mob

+0

Perl v5.16.0 및 IO :: Handle v1.33을 실행 중입니다. 위의 코드는 하나의 경고를 생성하지만, 두 가지를 생성해야한다고 생각합니다. 출력을 위해 열리지 않는다면'$ out-> print'는 경고해야합니다. –

+0

Perl 5.10.1 – leonbloy

답변

0

모든 버전> = 5.14 세 번째 줄 FH 메서드 호출에서 올바르게 경고합니다.

버전 5.10 및 5.12는 다르게 경고합니다. "IO :: File"패키지를 통해 "print"개체 메서드를 찾을 수 없습니다. 입력 전용 핸들에 대한 인쇄가 정의되어 있지 않기 때문입니다. 입력 핸들 읽기 결과를 인쇄하려면 print <$out>; 구문이 필요합니다.

버전 < 5.10은 말을하지 않지만 5.10 및 5.12와 동일하게 경고합니다.

관련 문제