2010-11-25 3 views
2

을 유발하지 사용 :과 같은 코드를 실행할 때 덤퍼가 실패

use strict; 
print Dumper "something"; 

아무것도 인쇄되지 않고 오류가 컴파일 및 실행 중에 발생하지 않는다. 왜 이런 일이 생길까요? strict이 코드가 실행되지 않는 이유는 무엇입니까? Dumper가 알려지지 않았지만 런타임에 오류가없는 이유는 무엇입니까?

경고가 명시 적으로 설정되면 경고 메시지가 표시되지만이 코드는 어떤 이유로 든 "올바른"것으로 간주됩니다. print에 대한 올바른 구문의

+0

왜 [정의 된 sdf가이 Perl 예제에서 true를 반환합니까?] (http://stackoverflow.com/questions/1646997/why-does-defined-sdf-return-true-in-this-perl -example) –

답변

7

하나는 프로그램에서

print FILEHANDLE LIST 

펄이 파일 핸들 글로브로 Dumper 치료이다.

당신을 말할 것이다 활성화 경고와 함께이 코드를 실행 : 당신이 표준 상용구로 시작했다 경우

print() on unopened filehandle Dumper at ...

+0

Ok - 이제 알겠습니다. 열지 않은 파일 핸들에 대한 작업이 기본적으로 오류가 아닌 구체적인 이유를 알고 있습니까? – viraptor

+6

@viraptor : 당신은 내 보더 플레이트를 사용하지 않았기 때문에. 그것은 유닉스가 결코 "please"라고 말하지 않기 때문이며 * 결코 "미안하다"라고 말하지 않는다. * – tchrist

+8

@viraptor : they * are * errors; print는 실패했음을 나타내는 false를 반환합니다. 그들은 또한 잠재적 인 코딩 오류를 나타 내기 때문에 경고입니다. * 경고를 사용하는 것이 엄격한 것을 사용하는 것보다 중요합니다. * 예외는 아닙니다. (모든 내장 된 또는 선택된 내장 된 함수에서 오류를 'autodie'를 사용하여 예외로 승격시킬 수는 있지만) 예외는 아닙니다. – ysth

11

는, 당신은 알게 될 것입니다 :

#!/usr/bin/env perl 
# 
# name_of_program - what the program does as brief one-liner 
# 
# Your Name <[email protected]_host.TLA> 
# Date program written/released 
################################################################# 

use 5.10.0; 

use utf8; 
use strict; 
use autodie; 
use warnings FATAL => "all"; 

# ⚠ change to agree with your input: ↓ 
use open ":std" => IN => ":encoding(ISO-8859-1)", 
        OUT => ":utf8"; 
# ⚠ change for your output: ↑ — *maybe*, but leaving as UTF-8 is sometimes better 

END {close STDOUT} 

our $VERSION = 1.0; 

$| = 1; 

을 대답은 당신의 프로그램이다 구문 론적이지만 의미 상 올바르지 않습니다. Dumperprint 메서드 호출의 데이터 슬롯에 있으므로 파일 핸들이 아닌 Dumper 파일 핸들 개체에 "something"을 인쇄하고 있습니다. 그것이 Dumperprint의 invocant가됩니다. 그러나 결코 그 이름으로 핸들을 열지 않으므로 초기화되지 않은 파일 핸들로 인쇄하고 있습니다.

내 상용구의 사용. 제발!

+1

'END' 블록의 핵심은 무엇입니까? – friedo

+2

@friedo : 플러시 (flush) 및 종료 (stdout) 오류가 발생했을 때 자동 응답되도록합니다. 디스크 꽉 참. I/O 오류. 그런 것들. – tchrist

+0

기본적으로 autoflush ($ |)를 설정하는 것은 좋지 않습니다. 때로는 의미가 있지만 항상 그런 것은 아니며, 상용구로 작성하면 안됩니다.적어도 상용구에는 선택 사항임을 나타내는 주석이 있어야합니다. –