PERL:ref,shift关键字

PERL:ref,shift关键字,perl,Perl,我正在执行以下子程序: sub new{ my $self = shift; my $class = ref($self) || $self; } 在这里,我不明白shift用于什么?我从谷歌搜索中了解到,shift返回并删除数组最左边的值。但我仍然不确定 另一个问题,ref用于什么?谷歌称它充当typeof函数,返回的类型类似于scalar,array,散列 我仍然不确定我的理解。有人能澄清一下吗 在Perl中调用子例程时,您提供的任何参数都将在一个名为@的特殊数组中提供

我正在执行以下子程序:

sub new{
    my $self  = shift;
    my $class = ref($self) || $self;
} 
在这里,我不明白
shift
用于什么?我从谷歌搜索中了解到,
shift
返回并删除数组最左边的值。但我仍然不确定

另一个问题,
ref
用于什么?谷歌称它充当
typeof
函数,返回的类型类似于
scalar
array
散列


我仍然不确定我的理解。有人能澄清一下吗

在Perl中调用子例程时,您提供的任何参数都将在一个名为
@
的特殊数组中提供给该子例程

函数将数组作为参数,从数组中删除第一个元素并返回该值

但是,如果调用
shift
而不向其传递数组,它将在
@
数组上运行

例如,如果调用如下子例程:

my_sub('one', 'two', 'three');
sub my_sub {
    my $arg1 = shift;
$obj->my_method('one');
sub my_method {
    my $self = shift;
my $my_obj = MyClass->new($arg1, $arg2);
my $new_obj = $my_obj->new($arg1, $arg2);
my_sub
的定义是这样开始的:

my_sub('one', 'two', 'three');
sub my_sub {
    my $arg1 = shift;
$obj->my_method('one');
sub my_method {
    my $self = shift;
my $my_obj = MyClass->new($arg1, $arg2);
my $new_obj = $my_obj->new($arg1, $arg2);
然后
$arg1
变量将包含字符串
'one'
,而
@
数组将保留
('two','three')

您试图理解的代码似乎与面向对象的编码有关。如果对如下对象调用方法:

my_sub('one', 'two', 'three');
sub my_sub {
    my $arg1 = shift;
$obj->my_method('one');
sub my_method {
    my $self = shift;
my $my_obj = MyClass->new($arg1, $arg2);
my $new_obj = $my_obj->new($arg1, $arg2);
然后,
myu方法
子例程实际上将在
@
中传递两个参数。第一个是调用方法的对象(有时称为
invocant
),在本例中为
$obj
。第二个参数是字符串
'one'

在面向对象代码中,启动如下方法定义非常常见:

my_sub('one', 'two', 'three');
sub my_sub {
    my $arg1 = shift;
$obj->my_method('one');
sub my_method {
    my $self = shift;
my $my_obj = MyClass->new($arg1, $arg2);
my $new_obj = $my_obj->new($arg1, $arg2);
这意味着
$self
现在将包含发票,而
@
将保留所有剩余参数

在您的特定示例中,您看到了一个构造函数,它是一种特殊的方法。通常会这样称呼:

my_sub('one', 'two', 'three');
sub my_sub {
    my $arg1 = shift;
$obj->my_method('one');
sub my_method {
    my $self = shift;
my $my_obj = MyClass->new($arg1, $arg2);
my $new_obj = $my_obj->new($arg1, $arg2);
在这种情况下,invocant将是调用
new
方法的类的名称,在本例中是字符串
'MyClass'

也可以在现有对象上调用构造函数,如下所示:

my_sub('one', 'two', 'three');
sub my_sub {
    my $arg1 = shift;
$obj->my_method('one');
sub my_method {
    my $self = shift;
my $my_obj = MyClass->new($arg1, $arg2);
my $new_obj = $my_obj->new($arg1, $arg2);
对于普通读者来说,这个电话的确切结果并不清楚。它应该是一个全新的对象,是
$my_obj
的克隆,还是一个与
$my_obj
毫无共同之处的新对象?在第一种情况下,定义
clone
方法会更清晰,在第二种情况下,调用类上的构造函数会更清晰

您的示例代码试图处理这两种情况。如果发票是一个类,那么
ref($self)
将返回
unde
,因为普通字符串(类名)不是引用。如果发票是一个对象,那么
ref($self)
将返回该对象作为实例的类的名称


如果您试图探索Perl对OO编程的本机支持,那么从。如果你只是想用Perl进行OO编程,那么就从开始吧。

我不太喜欢粘贴链接,但这些链接可以回答你的问题。出于我的良好意愿:我建议你从一个连贯的来源阅读这篇文章。这是很重要的东西,谷歌快速搜索答案不会在将来减少它。除非有人愿意写一篇教程,否则帖子也不会这么短。但他们已经在那里了。