当前位置:  开发笔记 > 编程语言 > 正文

在perl中,没有符号的这些变量是什么?

如何解决《在perl中,没有符号的这些变量是什么?》经验,为你挑选了1个好方法。

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

在包含FlatDB,sub new,第141页,他有以下声明:

保佑{FH => $跳频,栏=>\@field,FIELDNUM => \%fieldnum,FIELDSEP => $ FIELDSEP} => $类;

其中$ 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";
 }

Matt Jacob.. 9

它们不是变量.

它们是受祝福的哈希引用(即对象)中的键." 胖逗号 "(=>运算符)允许左侧的单词如果以字母或下划线开头并且仅包含字母数字字符和下划线,则将其解释为字符串.(这与对象无关,但在初始化散列或散列引用时,或者当有人明确尝试指示关联时,您通常会看到此语法.)

回答你的问题:

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

因为您将其作为方法调用.语法接近取消引用运算符,但不完全相同.事实上,文档甚至说明了这一点:

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

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

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

->取消引用引用时也使用该语法.它看起来像是同一个操作符,但这是两个不同的操作.

和:

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

否则,右侧是方法名或含有任一方法名称或子程序参考,和左侧的简单的标量变量必须是一个对象(一个幸福的参考)或类名(即,一个包的名称) .见perlobj.

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

my $obj = FlatDB->new;

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

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

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



1> Matt Jacob..:

它们不是变量.

它们是受祝福的哈希引用(即对象)中的键." 胖逗号 "(=>运算符)允许左侧的单词如果以字母或下划线开头并且仅包含字母数字字符和下划线,则将其解释为字符串.(这与对象无关,但在初始化散列或散列引用时,或者当有人明确尝试指示关联时,您通常会看到此语法.)

回答你的问题:

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

因为您将其作为方法调用.语法接近取消引用运算符,但不完全相同.事实上,文档甚至说明了这一点:

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

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

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

->取消引用引用时也使用该语法.它看起来像是同一个操作符,但这是两个不同的操作.

和:

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

否则,右侧是方法名或含有任一方法名称或子程序参考,和左侧的简单的标量变量必须是一个对象(一个幸福的参考)或类名(即,一个包的名称) .见perlobj.

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

my $obj = FlatDB->new;

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

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

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

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有