【问题标题】:In perl, what are these variables without sigils?在 perl 中,这些没有符号的变量是什么?
【发布时间】:2015-12-25 07:25:15
【问题描述】:

我正在尝试理解高阶 Perl 的平面文件数据库。

在 FlatDB 包中,sub new,在第 141 页,他有这样的声明:

祝福 { FH => $fh, FIELDS => \@field, FIELDNUM => \%fieldnum, FIELDSEP => $FIELDSEP } => $class;

其中 $class== FlatDB。

这些没有符号的变量(FH、FIELDNUM 等)是什么?如何打印它们的值、查找它们的类型或使用它们?

FlatDB 似乎是某种哈希值,但我所有打印值的尝试都会导致错误,例如:

printhash(\%fieldnum,"at37:\\%fieldnum=");
# prints the hash properly, BUT
printhash(FlatDB{FIELDNUM),"at38:FlatDB{FIELDNUM}=");
printhash(FlatDB->FIELDNUM,"at39:FlatDB->FIELDNUM=");
# print the error:
# Can't locate object method "FIELDNUM" via package "FlatDB"

当 FIELDNUM 被定义为哈希时,为什么它认为它是一个方法?

仅供参考:printhash 子是:

sub printhash
 { my $href=shift;  # a REFERENCE to a hash
   my $msg=shift;   # a text message
   my %h = %{$href};
   my $len = keys %h;;
   print "\n$msg, length=$len";
   foreach my $k ( keys %h )
   { print "\nkey: $k, value: $h{$k}";  }
   print "\n";
 }

【问题讨论】:

    标签: perl class variables


    【解决方案1】:

    它们不是变量。

    它们是受祝福的哈希引用(即an object)中的键。 “fat comma”(=> 运算符)允许将左侧的​​裸字解释为字符串,如果它以字母或下划线开头并且仅包含字母数字字符和下划线。 (这与对象无关,但在初始化散列或散列引用时,或者当有人明确地试图指示关联时,您通常会看到这种语法。)

    回答你的问题:

    当 FIELDNUM 被定义为哈希时,为什么它认为它是一个方法?

    因为您将它作为一种方法来调用。语法接近dereference operator,但不完全相同。事实上,documentation 甚至说了一些这样的话:

    在对象上调用方法写成$object->method

    方法调用(或箭头)运算符的左侧是 对象(或类名),右边是方法名。

    my $pod = File->new( 'perlobj.pod', $data );
    $pod->save();
    

    -> 语法也用于取消引用引用。它看起来 就像同一个运算符,但这是两个不同的运算。

    还有:

    "->" 是一个中缀解引用运算符,就像在 C 和 C++ 中一样。 如果右侧是 [...]{...}(...) 下标,那么左边必须是硬的或符号的 分别引用数组、散列或子例程。 (或者 从技术上讲,一个能够持有硬参考的位置, 如果它是用于分配的数组或哈希引用。)请参阅 perlreftutperlref

    否则右边是方法名或者简单的标量变量 包含方法名称或子例程引用,以及 左侧必须是对象(受祝福的引用)或类 名称(即包名称)。见perlobj

    但实际上,您可能想要的是该类的一个实例,它看起来像这样:

    my $obj = FlatDB->new;
    

    然后你可以像这样访问对象成员:

    $obj->{FH};
    @{$obj->{FIELDS}};
    %{$obj->{FIELDNUM}};
    $obj->{FIELDSEP};
    

    但你不应该因为封装。不幸的是,解释这一点和其他 OOP 原则超出了这个答案的范围。

    【讨论】:

      猜你喜欢
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      相关资源
      最近更新 更多