2011-11-13 3 views
1

안녕하세요 저는 펄을 할 일을 위해 펄을 변환하는 중입니다.Perl 대 파이썬 해시 테이블 번역

나는 펄의 해시 테이블에 대한 코드를보고 있었고 파이썬에서하는 일을 어떻게하는지 모르는 코드 라인을 발견했다. 나는 누군가가 나에게 이것은 파이썬으로 표현 될 것입니다 방법에 대한 아이디어를 전해 주 시겠어요 1

%page_table =();   #page table is a hash of hashes 
%page_table_entry = (  #page table entry structure 
"dirty", 0,     #0/1 boolean 
"referenced", 0,   #0/1 boolean 
"valid", 0,     #0/1 boolean 
"frame_no", -1,    #-1 indicates an "x", i.e. the page isn't in ram 
"page", 0     #used for aging algorithm. 8 bit string.); 
@ram = ((-1) x $num_frames); 

에 의해 페이지의 비트 문자열을 이동 알고? 해시 테이블에 대한 정의가 완료되었습니다. 여기에는 내가 수행중인 작업에 대한 참조가 있습니다. 당신이 내게 줄 수있는 도움을 주셔서 감사합니다.

for($i=0; $i<@ram; $i++){ 
    $page_table{$ram[$i]}->{page} = $page_table{$ram[$i]}->{page} >> 1;} 

답변

3

유일한 혼동은 페이지 테이블이 해시의 해시라는 것입니다. $ page_table {$ v}는 값이 정수인 키 '페이지'를 포함하는 해시에 대한 해시 참조를 포함합니다. 루프 비트는 해당 정수를 변경하지만 매우 명확한 perl 코드는 아닙니다. 간단한 것 :

foreach my $v (@ram) { 
    $page_table{$v}->{page} >>= 1; 
} 

지금 파이썬 번역이 명백해야한다 :

for v in ram: 
    page_table[v][page] >>= 1 
+0

감사합니다. 해시의 해시가 혼란 스럽습니다. 명확한 답변을 드릴 것입니다. – sylverfyst

+1

번역이 덜 분명한데, '$ page_table {$ _} {page} >> = 1은 @ ram입니다. –

+0

에릭, 너 맞아. Perl이라면 다른 변수 $ v를 추가 할 필요가 없습니다. –

-2

우와! 파이썬을 시험해보고 싶지는 않을 것입니다.

그렇습니다. Python 사전 (Perl에서 해시라고하는 것)이 다른 배열이나 사전을 참조 할 수 없기 때문에 Python에서이를 수행 할 수 있습니다.

그러나 I 고도로은 객체 지향 프로그래밍으로 옮겨 갈 것을 제안합니다. 그 할당 문을보고 난 후에, 나는 조금 누워야 만했다. 나는 그와 같은 전체 프로그램을 유지하고 쓰려고 노력하는 것을 상상할 수 없다.

배열이나 배열 배열 또는 해시 해시가 포함 된 해시를 수행해야 할 때마다 개체 지향 코드를 사용해야합니다. 객체 지향 코드는 이러한 유형의 작업을 수행 할 때 발생하는 모든 종류의 오류를 방지합니다. 또한 Perl 코드까지도 훨씬 더 읽기 쉬운 코드로 만들 수 있습니다.

Python Tutorial을보고 Perl Object Oriented Tutorial을보고 객체 지향 프로그래밍에 대해 자세히 알아보십시오.

이것은 특히 파이썬에서 객체 지향적 일 때 작성되었습니다.