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

时间:2015-05-25 21:32:56

标签: perl oop object global

我的问题是,希望简单。

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

sub throw
{
    die(shift);
}

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

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

请注意:如果做这样的事情被认为是最佳做法,我真的不在乎。虽然它们在Perl中执行相同的功能,但是不会抛出die,并且throw不会死掉。以下语法不遵循我要遵循的OOP原则:

die new Exception($message);

但在逻辑上相似,为了抛出异常,我更喜欢以下语法:

throw new Exception($message);

非常感谢stackoverflow社区!

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

这样的范例怎么样,可以同时解决你的问题?

package Exception;

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

sub new {
  # whatever
}

...

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

package SomeClass;

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