나는 SDBM_File
모듈을 사용하는 Perl 연결 해시를 가지고 있으며 값을 저장하거나 가져올 때 일부 문자 인코딩 변환을 수행해야합니다.filter_fetch_key에 대해 perldbmfilter를 사용하여 묶인 해시 반복자에 대한 무한 재귀
나는 documentation of perldbmfilter
을 따라 갔고 일반적으로 제대로 작동하는 것으로 보입니다 : 예상대로 올바르게 인코딩 된 해시 결과를 얻었습니다. 인코딩에 대한 바이트 값을 파일에 저장합니다.이 값은 16 진수 편집기를 사용하여 확인합니다.
keys
또는 each
또는 Data::Dumper
과 같은 해시 요소 또는 다른 해시에 대한 간단한 복사 작업을 사용하여 모든 해시 요소에 대한 반복 작업이 효과가 없습니다.
항상 얻는 것은 무한 재귀입니다. iterator가 끝까지 도달하지 못하는 것처럼 보입니다. 그리고 each
을 사용하고 iterated 값을 인쇄하면 반복됩니다.
filter_fetch_key
의 사용으로 문제점을 찾아 내고 거기에서 수행하는 charset 변환을 수행합니다. filter_fetch_key
을 주석 처리하거나 필터 방법을 return shift
으로 변경하면 반복이 다시 작동합니다. 이 중 하나는 내 문제를 해결하지만 호출자가 올바르게 인코딩 된 문자열을 보내려면 filter_fetch_key
을 사용해야합니다.
$dbm->filter_fetch_key (sub { $_ = $self->_normalizeCharset($_); });
sub _normalizeCharset
{
my $self = shift || Carp::croak(...);
#return shift;
return ...::windows2utf(shift);
}
return shift
의 주석을 제거하면 반복이 수행됩니다. 하지만 위와 같이 주석을 달았습니다. 나는 그것이 $_
에 일어나는 일을 할 것이라고 생각하지만, windows2utf
은 주어진 데이터를 복사하고 일부 문자 인코딩을하기 때문에 나는 전혀 모른다. 키와 값을 저장하고 값을 가져 오는 경우에도 동일한 방식으로 작동합니다. 유일한 키는 문제이며, 반복 할 경우에만, 특정 키를 직접 요청하지 않아야합니다.
내가 잘못하고있는 것에 대한 힌트가 있습니까?
Perlmonks
에 스레드가 있습니다.
http://www.perlmonks.org/?node_id=1099905 – choroba
코드를 좀 더 살펴 보는 것이 좋을 것입니다. '$ dbm'이란 무엇입니까? 상응하는'filter_store_key'를 가지고 있습니까? '... :: windows2utf' 란 무엇입니까? – Borodin
정규화를 수행하는 방법을 사용한 이유가 표시되지 않습니다. 당신의 필터는'sub {$ _ = _normalizeCharset (undef, $ _)}'또는 심지어'sub {$ _ = ... :: windows2utf (shift)} '일 수도 있습니다. 그러나 나는 그 신비한' ... :: windows2utf'일지도 모릅니다. – Borodin