题
我不明白,这可能是左值子程序的用途?它是什么,我不能正常的子程序完成?能否请您发布一些例子吗?
由于
解决方案
建议
左值要避免。他们的乐趣和所有,但是他们搞不清谁使所有潜艇是如何工作的假设新用户,因此应该避免在代码的时候更好的方法是可用的。
有时也可以是非常实用的使用左值结果做肮脏的工作。
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的用户。
不隶属于 StackOverflow