将perl转换为python - 这一行做了什么(类变量混淆)

时间:2013-12-06 17:02:27

标签: python perl

$self->{DES} ->{$id} = join("\t",@tmp[0 ..7]);

这一行是perl类中函数的一部分,其构造函数是

sub new {
    my $class=shift;
    my $self ={};
    bless($self,$class);
    return $self;
}

我解释它的方式是我们将id行存储为类变量DES,它是一个散列,其成员是$ id:。这是对的吗?

我还想澄清=~运算符(它似乎总是在正则表达式之前)。据我所知,它基本上与python中的re.X相同,其中X依赖于perl中正则表达式之后的标志(例如i)。这是对的吗?

1 个答案:

答案 0 :(得分:6)

您的解释是正确的。 Perl将自动创建哈希内部哈希,类似于Python的defaultdict子类,以创建更多默认值。使用常规dict和惯用Python,等效赋值将转换为:

def __init__(self, ...):
    self.DES = {}

def foo(self, ...):
    self.DES[id_] = "\t".join(tmp[:7])

引用的new子是Python在库存__new__中的作用:

def __new__(cls):
    self = object.__new__(cls)
    return self

bless类似于分配给self.__class__,除非您不需要在Python中执行此操作,因为object.__new__已经创建了正确类的对象。该对象首先被创建为哈希(dict),因为在Perl中,大多数类对象都继承自哈希 - 与Python不同,其中对象通常包含一个词典,而不是从它继承。

=~运算符等同于在自动编译的正则表达式模式上调用pattern.search。仅当模式以re.X结尾时,才会获得/x语法。模式的其他选项可以在丰富的perlre man page中找到。