use open qw(:encoding(UTF-8) :std);
위의 문장은 어휘 범위에서만 유효하며 범위 외부에는 영향을 미치지 않아야합니다. 그러나 나는 다음을 관찰했다.Perl의 "open open ..."에 대한 어휘 범위 지정의 이해
$ cat data
€
# 1
$ perl -e '
open (my $fh, "<encoding(UTF-8)", "data");
print($_) while <$fh>;'
Wide character in print at -e line 1, <$fh> line 1.
€
Wide character ...
경고가 여기에 최적입니다. 그러나
$ perl
my ($fh, $row);
{
use open qw(:encoding(UTF-8) :std);
open ($fh, "<", "data");
}
$row = <$fh>;
chomp($row);
printf("%s (0x%X)", $row, ord($row));
€ (0x20AC)
는 와이드 문자 경고를 표시하지 않습니다! 여기에 무슨 일이 일어나고 있습니까?
- 오픈 프라그마를 사용하여 STDOUT을 포함하여 IO 스트림을 UTF-8로 설정하고 있습니다.
- 동일한 범위 내에서 파일 열기. 문자를 멀티 바이트 문자로 읽습니다.
- 범위 밖에서 인쇄 중입니다. print 문에는 "와이드 문자"경고가 표시되어야하지만 그렇지 않습니다. 왜?
지금 다음, 약간의 변화를 보면
my ($fh, $row);
{
use open qw(:encoding(UTF-8) :std);
}
open ($fh, "<", "data");
$row = <$fh>;
chomp($row);
printf("%s (0x%X)", $row, ord($row));
⬠(0xE2)
지금 열린 문은 어휘 범위를 벗어나 있기 때문에이 시간의 open
비 UTF-8로 파일을 연 # 방법.
use open qw(:encoding(UTF-8) :std);
문은 어휘 범위 내에서 STDOUT을 전체적으로 변경하지만 STDIN을 변경합니까?
YAPC NA 2016에서 Ricardo Signes의 토크 [백만 억 달러짜리 캐릭터] (https://www.youtube.com/watch?v=TmTeXcEixEg)를 참조하십시오. 'open'pragma에 대한 논의는 [35 : 44] (https://youtu.be/TmTeXcEixEg?t=2144) –
예 'open q w (: std)'는 표준 핸들을 전역 적으로 변경합니다. 위에서 언급 한 리카르도 (Ricardo)의 말처럼. –
': std' 부분은 어휘 적으로 범위가 지정되지 않고 단편에서 사용하지 않는'open()'에서 사용되는 기본 레이어 만 변경됩니다. – ikegami