Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
声明全局perl子例程或全局别名_Perl_Oop_Object_Global - Fatal编程技术网

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

声明全局perl子例程或全局别名,perl,oop,object,global,Perl,Oop,Object,Global,我的问题很简单 在Perl中,如何创建一个全局作用域的子例程,此后所有对象都可以访问它 sub throw { die(shift); } 似乎在全局范围内工作,但以后的包无法访问。我希望避免在我的应用程序堆栈中的每个对象中都声明这一点 侧面解决方案:如何为全局关键字(如die)创建别名 请注意:我真的不在乎这样做是否被视为最佳实践。虽然它们在Perl中执行相同的函数,但die不是throw,throw也不是die。以下语法没有遵循我试图遵循的OOP原则: die new Except

我的问题很简单

在Perl中,如何创建一个全局作用域的子例程,此后所有对象都可以访问它

sub throw
{
    die(shift);
}
似乎在全局范围内工作,但以后的包无法访问。我希望避免在我的应用程序堆栈中的每个对象中都声明这一点

侧面解决方案:如何为全局关键字(如die)创建别名

请注意:我真的不在乎这样做是否被视为最佳实践。虽然它们在Perl中执行相同的函数,但die不是throw,throw也不是die。以下语法没有遵循我试图遵循的OOP原则:

die new Exception($message);
throw new Exception($message);
无论逻辑上多么相似,为了抛出异常,我更喜欢以下语法:

die new Exception($message);
throw new Exception($message);

非常感谢stackoverflow社区

您可以将
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!');

请参阅。

像这样的范例如何,它可以同时解决您的两个问题

package Exception;

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

sub new {
  # whatever
}

...
然后在任何软件包中,您都可以使用它:

package SomeClass;

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

非常有趣!我喜欢这个主意!它确实集中了它。我假设没有办法做到这一点,因为我偶然使用了语法“thrownewsomeobj()”?顺便说一句,我之前一直在寻找如何做到这一点。Perldocs有时有点模糊。另一个注释,我想我会在上面加上。我的意图是抛出对受祝福异常对象的引用。希望通过这样做,我可以在其中存储各种有用的信息,例如堆栈跟踪。再次感谢@史蒂夫:
die
可以抛出异常对象。我知道。但是,我不喜欢语法“die new Exception()”——如上所述。通常的方法是创建一个模块
MyThrow
,该模块导出
抛出
,并从其他模块/脚本中使用它。请不要编写
新类名
。在Perl中,
new
只是一个方法的名称,而不是一个关键字,它可能会混淆解释器。相反,请使用
Exception->new($message)