声明全局 perl 子例程或全局别名

declaring global perl subroutines or global aliases

我的问题是,希望很简单。

在 Perl 中,如何创建一个全局范围内的子程序供其后的所有对象访问?

sub throw
{
    die(shift);
}

似乎在全球范围内工作,但之后的包无法访问。我想避免在我的应用程序堆栈中的每个对象中进行某种声明。

附带解决方案:如何为像 die 这样的全局关键字创建别名?

请注意:我真的不在乎这样做是否被认为是最佳实践。尽管它们在 Perl 中执行相同的功能,但 die 不是 throw,throw 也不是 die。以下语法不遵循我试图遵循的 OOP 原则:

die new Exception($message);

但是逻辑上相似,为了抛出异常,我更喜欢这样的语法:

throw new Exception($message);

非常感谢 Whosebug 社区!

您可以将 throw 添加到 UNIVERSAL 包中(这不是一个好的做法)。

请注意,您的 throw 会忽略该消息并仅显示 class 姓名。

#!/usr/bin/perl
use warnings;
use strict;

{   package UNIVERSAL;

    sub throw { die shift }
}

{   package MyClass;

    sub new { bless {}, shift }
}

my $c = 'MyClass'->new;
$c->throw('Ouch!');

Try::Tiny

像这样的范例怎么样,它可以同时解决您的两个问题?

package Exception;

sub throw {
  my $message = shift;
  die Exception->new($message);
}

sub new {
  # whatever
}

...

然后在任何包中你都可以这样使用它:

package SomeClass;

sub do_something {
  ...
  if ($error) {
    Exception->throw($message);
  }
}