我的$self = Perl中的移位;一个解释

我非常难以理解Perl和我的$ self = shift的交点;关于这些单独元素的文档是非常好的,但是我没有发现任何一个这些文档能够在一起工作。

我一直在使用Moose来制作具有属性的模块,当然也可以在模块中引用模块的属性。我一直被告知使用我的$ self = shift;在子程序中将模块的属性分配给该变量。这是有意义和有效的,但是当我也将参数传递给子例程时,这个过程显然需要@ARGV数组的第一个元素,并将其分配给$ self。

有人可以提供一个解释,说明如何使用shift来获取对模块属性的内部访问,同时还传递@ARGV数组中的参数?

解决方法

首先,一个子程序不会传递给@ARGV数组。而传递给子例程的所有参数都被平铺为子程序中由@_表示的单个列表。 @ARGV数组在脚本的顶层可用,其中包含传递给您脚本的命令行参数。

现在,在Perl中,当您调用对象上的方法时,该对象将作为参数隐式传递给该方法

所以这:

$obj->doCoolStuff($a,$b);

相当于:

doCoolStuff($obj,$a,$b);

这意味着方法doCoolStuff中的@_的内容将是:
@_ =($ obj,$ a,$ b);

现在,没有任何参数的shift内置函数将元素从默认数组变量@_中移出。在这种情况下,这将是$ obj。

所以当你做$ self = shift时,你实际上是说$ self = $ obj。

我也希望这解释了如何通过以下方式将其他参数传递给方法:符号。继续上面我已经说过的例子,就像:

sub doCoolStuff {
  # Remember @_ = ($obj,$b)
  my $self = shift;
  my ($a,$b) = @_;

另外,虽然Moose是Perl的一个很好的对象层,但是它并没有从每一种方法中需要自己初始化$ self的要求。永远记住这一点。虽然C和Java这样的语言隐式地初始化对象引用,但在Perl中,您需要为每个写入的方法明确地执行此操作。

相关文章

忍不住在 PerlChina 邮件列表中盘点了一下 Perl 里的 Web 应用框架(巧的是 PerlBuzz 最近也有一篇相关...
bless有两个参数:对象的引用、类的名称。 类的名称是一个字符串,代表了类的类型信息,这是理解bless的...
gb2312转Utf的方法: use Encode; my $str = "中文"; $str_cnsoftware = encode("utf-8...
  perl 计算硬盘利用率, 以%来查看硬盘资源是否存在IO消耗cpu资源情况; 部份代码参考了iostat源码;...
1 简单变量 Perl 的 Hello World 是怎么写的呢?请看下面的程序: #!/usr/bin/perl print "Hello W...
本文介绍Perl的Perl的简单语法,包括基本输入输出、分支循环控制结构、函数、常用系统调用和文件操作,...