gpt4 book ai didi

perl - 在 Perl 中是否有安全取消引用的便利?

转载 作者:行者123 更新时间:2023-12-04 20:15:47 25 4
gpt4 key购买 nike

所以 perl5porters 正在讨论添加一个安全的解引用运算符,以允许类似的东西

$ceo_car_color = $company->ceo->car->color
if defined $company
and defined $company->ceo
and defined $company->ceo->car;

缩短为例如
$ceo_car_color = $company->>ceo->>car->>color;

在哪里 $foo->>bar表示 defined $foo ? $foo->bar : undef .

问题:是否有一些模块或不显眼的 hack 让我得到这个运算符,或者具有视觉上令人愉悦的语法的类似行为?

为了您的享受,我将列出我能够提出的想法。
  • 多重解除引用方法(看起来很难看)。
    sub multicall {
    my $instance = shift // return undef;
    for my $method (@_) {
    $instance = $instance->$method() // return undef;
    }
    return $instance;
    }

    $ceo_car_color = multicall($company, qw(ceo car color));
  • 变成 undef 的包装器进入一个返回 undef 的代理对象(看起来更丑)从所有函数调用。
    { package Safe; sub AUTOLOAD { return undef } }
    sub safe { (shift) // bless {}, 'Safe' }

    $ceo_car_color = safe(safe(safe($company)->ceo)->car)->color;
  • 因为我可以访问 ceo() 的实现, car()color() ,我考虑过直接从这些方法返回安全代理,但现有代码可能会中断:
    my $ceo = $company->ceo;
    my $car = $ceo->car if defined $ceo; # defined() breaks

    不幸的是,我在 perldoc overload 中没有看到任何内容关于重载defined的含义和 //在我的安全代理中。
  • 最佳答案

    也许这不是最有用的解决方案,但它是另一个 WTDI(nr. 1 的变体),它是 List::Util 的一个重要用例的减少 , 这是非常罕见的。 ;)

    代码

    #!/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!';

    输出
    42
    undef!

    笔记:

    当然应该是
    return unless defined $a;
    $a = $a->$b;

    而不是更短的 $a and $a = $a->$b从上面可以正确使用已定义但错误的值,但我的意思是使用 减少 .

    关于perl - 在 Perl 中是否有安全取消引用的便利?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12617944/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com