gpt4 book ai didi

perl - 在 Perl 中使用未知方法

转载 作者:行者123 更新时间:2023-12-04 17:10:29 24 4
gpt4 key购买 nike

我很难理解,为什么 Perl 在这样的程序中执行花括号中的代码:

unknown_method {
# some code
};

我的程序:

文件交易.pm:
package Transaction;
use strict;
use warnings;
use feature qw/ say /;

sub transaction(&) {
say 'BEGIN TRANSACTION';
eval {
shift->()
};
if ( $@ ) {
say 'ROLLBACK TRANSACTION';
die($@); # reraise error
} else {
say 'COMMIT TRANSACTION';
}
}
1;

文件 run_properly.pl:
use feature qw/ say /;
use Transaction;
eval {
Transaction::transaction {
say "insert some data to DB";
die("KnownException")
}
};
warn $@;

文件 run_wrong.pl:
use feature qw/ say /;
# I forgot to import Transaction
eval {
Transaction::transaction {
say "insert some data to DB";
die("KnownException")
}
};
warn $@;

执行:
$ perl run_properly.pl 
BEGIN TRANSACTION
insert some data to DB
ROLLBACK TRANSACTION
KnownException at run_properly.pl line 6.


$ perl run_wrong.pl 
insert some data to DB
KnownException at run_wrong.pl line 6.

为什么 Perl 允许这样的事情?

最佳答案

Perl 在语法上很灵活,并且经常有不止一种语法做事。例如,调用方法。这是常规和推荐的语法:

  Foo  ->  new       (1, 2, 3);
# ^-object ^- method ^- arguments

这是间接语法:
  new       Foo       1, 2, 3;
# ^- method ^- object ^- arguments, parens are optional

这一切都很好,但是当我们想将复杂计算的结果用作具有间接对象符号的对象时会发生什么?
# set up some constructors for demonstration purposes
*Foo::new = *Bar::new = sub {say "@_"};

# This obviously fails
# new (rand > .5 ? "Foo" : "Bar") 1, 2, 3;

解决方案是一个与格块:
new {rand > .5 ? "Foo" : "Bar"} 1, 2, 3;

您可能已经知道文件句柄中的与格块: print {$handles[-1]} $_ .

与格块在方法解析之前执行,因为方法解析通常(但不是在您的情况下)取决于对象的类型。但是,如果块 die,则不会解析任何方法。 s。

间接表示法对于构造函数仍然很流行,因为它使 Perl 看起来像 C++。但是,Perl(与 C++ 不同)没有 new运算符(operator):这只是一个常规方法。这种灵活性可能不是一个好主意,因此您可以使用 no indirect 来“修复”它。如果你对此有强烈的感觉。

关于perl - 在 Perl 中使用未知方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17003573/

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