Perl 到 Python 的哈希表翻译
你好,我正在把perl代码转换成python,找点事情做。
我在看perl中的哈希表代码时,遇到了一行我不太明白在python中怎么实现的代码。我知道它是把页面的位字符串向右移动了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);
有人能告诉我在python中怎么表示这个吗?我已经完成了哈希表的定义,它们只是作为我正在做的事情的参考。谢谢你们的任何帮助。
for($i=0; $i<@ram; $i++){
$page_table{$ram[$i]}->{page} = $page_table{$ram[$i]}->{page} >> 1;}
3 个回答
-2
汪汪!难怪你想试试Python!
没错,Python可以做到这一点,因为Python的字典(在Perl中叫做哈希)可以包含其他数组或字典,而不需要特别去引用它们。
不过,我强烈建议你考虑学习面向对象编程。看到你那段赋值语句,我都得躺下休息一下。我真不敢想象要维护和编写这样一个完整的程序会有多难。
每当你需要创建一个包含数组的哈希,或者一个数组的数组,或者一个哈希的哈希时,你就应该考虑使用面向对象的代码。面向对象的代码可以帮助你避免在处理这些复杂结构时出现的各种错误。而且,它还能让你的代码更易读——即使是Perl代码也是如此。
你可以看看Python教程,再看看Perl面向对象教程,了解一下面向对象编程。
这在Python中尤其重要,因为Python从一开始就是为了支持面向对象编程而设计的。
0
这是我的 Pythonizer 为那段代码生成的内容:
#!/usr/bin/env python3
# Generated by "pythonizer -mV q8114826.pl" v0.974 run by snoopyjc on Thu Apr 21 23:35:38 2022
import perllib, builtins
_str = lambda s: "" if s is None else str(s)
perllib.init_package("main")
num_frames = 0
builtins.__PACKAGE__ = "main"
page_table = {} # page table is a hash of hashes
page_table_entry = {"dirty": 0, "referenced": 0, "valid": 0, "frame_no": -1, "page": 0}
# page table entry structure
# 0/1 boolean
# 0/1 boolean
# 0/1 boolean
# -1 indicates an "x", i.e. the page isn't in ram
# used for aging algorithm. 8 bit string.
ram = [(-1) for _ in range(num_frames)]
for i in range(0, len(ram)):
page_table[_str(ram[i])]["page"] = perllib.num(page_table.get(_str(ram[i])).get("page")) >> 1
3
唯一让人困惑的是,页面表是一个“哈希的哈希”。也就是说,$page_table{$v}里存的是一个指向另一个哈希的引用,这个哈希里面有一个键叫做'page',它的值是一个整数。循环里对这个整数进行了位移操作,但这段Perl代码看起来不是很清晰。更简单的写法应该是:
foreach my $v (@ram) {
$page_table{$v}->{page} >>= 1;
}
现在把它转换成Python应该很明显了:
for v in ram:
page_table[v][page] >>= 1