首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Perl中安全地取消引用有方便吗?

在Perl中安全地取消引用有方便吗?
EN

Stack Overflow用户
提问于 2012-09-27 09:14:30
回答 2查看 270关注 0票数 5

因此,perl5porters正在讨论添加一个安全的解引用操作符,以允许类似

代码语言:javascript
运行
复制
$ceo_car_color = $company->ceo->car->color
    if  defined $company
    and defined $company->ceo
    and defined $company->ceo->car;

被缩短为。

代码语言:javascript
运行
复制
$ceo_car_color = $company->>ceo->>car->>color;

其中$foo->>bar的意思是defined $foo ? $foo->bar : undef

的问题是:是否有一些模块或非遮遮掩掩的黑客让我得到了这个操作符,或者类似的行为,有一个视觉上令人愉悦的语法?

为了你的快乐,我会列出我能想出的点子。

  1. 一种多重解禁方法(看起来很难看)。 子$instance =移位//返回undef;$method (@_) { $instance = $instance->$method() //返回undef;} $ceo_car_color = multicall($company,qw(首席执行官汽车颜色));
  2. undef转换为代理对象(看起来更丑)的包装器,它从所有函数调用中返回undef。 {包安全;子自动返回undef }亚安全{(移位) //祝福{},‘安全’} $ceo_car_color =安全($company)->ceo)->car)->color;
  3. 由于我可以访问ceo()car()color()的实现,所以我考虑直接从这些方法返回安全代理,但是现有的代码可能会中断: 我的$ceo = $company->ceo;我的$car =$ceo->汽车(如果定义为$ceo);# defined()中断 不幸的是,我在perldoc overload中没有看到任何关于在我的安全代理中重载defined//的意义。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-27 10:01:12

也许这不是最有用的解决方案,但它是又一个WTDI ( nr的变体)。( 1)这是清单::Utilreduce的一个重要的用例,非常罕见。)

代码

代码语言:javascript
运行
复制
#!/usr/bin/env perl

use strict;
use warnings;
use feature     'say';
use List::Util  'reduce';

my $answer = 42;
sub new { bless \$answer }
sub foo { return shift }        # just chaining
sub bar { return undef }        # break the chain
sub baz { return ${shift()} }   # return the answer

sub multicall { reduce { our ($a, $b); $a and $a = $a->$b } @_ }

my $obj = main->new();
say $obj->multicall(qw(foo foo baz)) // 'undef!';
say $obj->multicall(qw(foo bar baz)) // 'undef!';

输出

代码语言:javascript
运行
复制
42
undef!

注意:

当然应该是

代码语言:javascript
运行
复制
return unless defined $a;
$a = $a->$b;

而不是上面的较短的$a and $a = $a->$b来正确地处理定义的但错误的值,但我这里的重点是使用reduce

票数 3
EN

Stack Overflow用户

发布于 2012-09-27 09:42:51

您可以使用eval

代码语言:javascript
运行
复制
$ceo_car_color = eval { $company->ceo->car->color };

但是它当然会捕捉到任何错误,而不仅仅是在undef上调用一个方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12617944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档