Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:对象方法的返回值不为';“t触发器”;如果;陈述_Perl_Oop - Fatal编程技术网

Perl:对象方法的返回值不为';“t触发器”;如果;陈述

Perl:对象方法的返回值不为';“t触发器”;如果;陈述,perl,oop,Perl,Oop,我正在尝试调试我的程序,如果有任何通知要获取,我想向观察者发送通知 我有一个方法Notify,它返回观察者希望遵循的文件列表。我的debug例程就是用来帮我调试程序的 这很有效。我看到第二个debug例程打印出值: foreach my $watcher ($watch->Watcher) { debug qq(Sending out notifcations for ) . $watcher->User, 2; my @foo = $watcher->Noti

我正在尝试调试我的程序,如果有任何通知要获取,我想向观察者发送通知

我有一个方法
Notify
,它返回观察者希望遵循的文件列表。我的
debug
例程就是用来帮我调试程序的

这很有效。我看到第二个
debug
例程打印出值:

foreach my $watcher ($watch->Watcher) {
    debug qq(Sending out notifcations for ) . $watcher->User, 2;
    my @foo = $watcher->Notify;
    if (@foo) {
        debug qq(Change list to notify on: ) . join (", " => $watcher->Notify), 3;
        $watch->SendEmail($watcher);
    }
}

但是,这一点失败了:

foreach my $watcher ($watch->Watcher) {
    debug qq(Sending out notifcations for ) . $watcher->User, 2;
    if ($watcher->Notify) {
        debug qq(Change list to notify on: ) . join (", " => $watcher->Notify), 3;
        $watch->SendEmail($watcher);
    }
}

第一个和第二个的区别:在第一个中,我将
$watcher->Notify
返回到数组
@foo
,并在
@foo
上进行测试。在第二个示例中,我测试
$watcher->Notify
的返回值

Notify子例程如下所示:

sub Notify {
    my $self   = shift;
    my $change = shift;

    $self->{CHANGE} = [] if not exists $self->{CHANGE};
    if (defined $change) {
        push @{$self->{CHANGE}}, $change;
    }
    return sort @{$self->{CHANGE}};
}

等一下。。。 好的,当我输入这个问题时,我意识到当我说
if($watcher->Notify)
时,我返回到一个标量上下文,当我说
@foo=$watcher->Notify时,我返回到一个列表上下文。进一步测试:

foreach my $watcher ($watch->Watcher) {
    debug qq(Sending out notifcations for ) . $watcher->User, 2;
    my $foo = $watcher->Notify;   #Now a SCALAR and not a LIST
    if ($foo) {
        debug qq(Change list to notify on: ) . join (", " => $watcher->Notify), 3;
        $watch->SendEmail($watcher);
    }
}

显示
$foo
为空。将我的方法更改为:

sub Notify {
    my $self   = shift;
    my $change = shift;

    $self->{CHANGE} = [] if not exists $self->{CHANGE};
    if (defined $change) {
        push @{$self->{CHANGE}}, $change;
    }
    if (wantarray) {
       return sort @{$self->{CHANGE}};
    }
    else {
       return scalar @{$self->{CHANGE}};
   }
}
现在起作用了。(方法现在检查是否需要数组,如果不需要,则返回显式标量)

问题是为什么

我认为,如果我将数组返回到标量上下文中,Perl应该为我自动执行
标量(并返回数组中的项数),或者至少使用
$”
作为分隔符连接数组中的所有元素(我假设第一个,但后者也可以)

例如:

#! /usr/bin/env perl

use strict;
use warnings;
use feature qw(say switch);
use Data::Dumper;

my @foo = qw(this that the other);

my $bar = @foo;

say "Bar = $bar   \@foo = @foo";
打印出:

Bar = 4   @foo = this that the other

我哪里出错了?(我的意思是,当价格一路上涨到40美元/股时,除了卖掉我所有的苹果股票之外)。

你没有返回数组。你返回的是标量上下文中调用的排序结果。根据:

在标量上下文中,
sort()
的行为未定义


这意味着它可以做任何它想做的事情,包括返回
undef

,因为您在标量上下文中返回了
sort
的结果:

发件人:

在列表上下文中,这将对列表进行排序并返回排序后的列表 在标量上下文中,sort()的行为未定义

编辑:如果您不想使用wantarray
,您可以更改:

return sort @{$self->{CHANGE}};
致:


@先生,根据时间戳,这是50秒;)但是谢谢。@先生:因为我返回了一个
sort@array
,而不仅仅是
@array
.Drats。我最近停止使用
wantarray
检查返回,因为我被告知这是不必要的,而且我想直到它出现时才使用。对不起
cjm
打败了你几秒钟。无论如何,谢谢。是的,我意识到我也可以做
@{[…]}
这件事,但对我来说
wantarray
更清晰,更容易让其他人理解和维护,而且效率也不会更低。
return @{ [sort @{$self->{CHANGE}}] };