我不明白,这可能是左值子程序的用途?它是什么,我不能正常的子程序完成?能否请您发布一些例子吗?

由于

有帮助吗?

解决方案

建议

左值要避免。他们的乐趣和所有,但是他们搞不清谁使所有潜艇是如何工作的假设新用户,因此应该避免在代码的时候更好的方法是可用的。

有时也可以是非常实用的使用左值结果做肮脏的工作。

substr( $string, $start, $stop ) = 'somevalue' # replaces the specified part of the substring. 

然而,这也做同样的事情:

substr( $string, $start, $stop , 'somevalue' ); 

这里的差异是主要是前有显著更具表现力,因为它代表的是使用它,而不是函数本身的行为的代码。

例如:

substr( $string, $start, $stop ) =~ s/a/b/g 

将要求您做

my $x = substr( $string, $start, $stop ); 
$x =~ s/a/b/g/; 
substr( $string, $start, $stop, $x );

这是有点讨厌。

虽然,还有这里是一个额外的讨厌的,因为你要考虑一下是否这样做,替代或不符合$ X适用追溯修改字符串或没有(因SUBSTR是一个左值子)。我不认为是这样,但也足够其暧昧我要检查手工记住不管它与否,这是不好的。

其他提示

可以使用左值潜艇作为setter方法对象成员:

sub x : lvalue {
    my $self = shift;
    $self->{x};
}

再后来:

$foo->x = 5;

此结合包封装定件的灵活性直接设置成员的直观性,以防以后要更改的对象是如何实现的。比较以下更传统的方式来设定部件在Perl:

直观但是易碎;如果你改变$ foo的是如何实现的?

$foo->{x} = 5;

传统setter方法;不使用赋值语法数额是多少,分配:

$foo->set_x(5);

当然,左值的方法从来没有真正被Perl社区接受和使用左值的潜艇是“怪异”和任何将获得的直觉会通过这一切的陌生感消失。

它们提供不同的接口,即在某些情况下可以更直观。不同于传统的制定者,你实际上可以直接更改值。例如

lvalue_sub($foo) =~ s/foo/bar/;

可以比

是清洁器
my $tmp = some_sub($foo);
$tmp =~ s/foo/bar/;
some_sub($foo, $tmp);

我不能多我在正常的Perl的东西使用起来说话,但他们正在片或一小罐的其它分部当Perl的数据语言广泛使用。例如:

my $a = sequence(100);
# use lvalue in this increment:
$a->where($a < 10)++;

# Zero-out the last four elements
# notice the use of the overloaded .= operator:
$a->slice("-10:") .= 0;

在Perl很多事情,这个功能没有太大的使用在整个生态系统,但它至少在这个利基使用,让生活的的方便PDL的用户。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top