gpt4 book ai didi

perl - Perl子例程如何报告调用它的行?

转载 作者:行者123 更新时间:2023-12-01 16:02:16 24 4
gpt4 key购买 nike

我正在编写一个Perl管道,一个脚本,该脚本调用各种其他程序并管理从一个程序到另一个程序的数据传递。该脚本(称为pipeline.pl)及其管理的各种子脚本共享一个由subroutines.ph定义并通过require subroutines.ph指令包含的常见子例程的列表。

其中之一是一个函数,其功能是退出打印错误消息(实际的子例程也执行其他一些工作,但是在这里它们不相关;不,我不是在重新发明die()):

## subroutines.ph
sub errorDie
{
my ($errMsg) = @_;
## various other cleanup tasks here
die($errMsg);
}
1;

并且,在 pipeline.pl中:

#!/usr/bin/perl 
require 'subroutines.ph';

errorDie("foo")

运行上面的脚本会导致:
foo at subroutines.ph line 5.

是否有可能改为报告如下内容:
foo at pipelines.pl line 4.

因此,与其报告在其上找到 die()的行,不应该报告原始脚本所在的行,从该行调用 errorDie子例程。我知道我可以通过将行包含在 $errMsg变量中来做到这一点,但这是脆弱且麻烦的。可以自动完成吗?可以在外部文件中定义的子例程检测到从何处调用它?

最佳答案

这就是Carpcroak的意义。
Pkg.pm:

package Pkg;

use Carp qw( croak );

sub some_func {
my ($cmd, $param) = @_;

$cmd eq 'encode' || $cmd eq 'decode'
or croak("Invalid command \"$cmd\"");

# ...
}

1;
a.pl:
use Pkg;

Pkg::some_func('foo', 'bar');

输出:
Invalid command "foo" at a.pl line 3.

关于perl - Perl子例程如何报告调用它的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42975191/

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