在Perl中,如何设置$!在从函数返回某些内容之前?
假设我有这个简单的函数在Perl中,如何设置$!在从函数返回某些内容之前?,perl,return,Perl,Return,假设我有这个简单的函数 say_hi() || die "ERROR: sub say_hi had an issue: Details => $!\n"; sub say_hi{ my ($name) = @_; return unless $name; print "Hi $name\n"; return 1; } 如何设置$的内容,以便在函数返回后使用。我正在尝试做一些类似的事情 open() || die "$!"; 是的。谢谢你perldoc-v$:
say_hi() || die "ERROR: sub say_hi had an issue: Details => $!\n";
sub say_hi{
my ($name) = @_;
return unless $name;
print "Hi $name\n";
return 1;
}
如何设置$的内容在sub中使用strong>,以便在函数返回后使用。我正在尝试做一些类似的事情
open() || die "$!";
是的。谢谢你
perldoc-v$代码>:
引用时,$代码>检索C的当前值“errno
”
整数变量。如果<代码>$代码>被分配了一个数值,即
存储在“errno”中。当作为字符串引用时,$代码>生成
与“errno
”相对应的系统错误字符串
。。。分配给$代码>同样是短暂的。信息技术
可以在调用“die()
”操作符之前立即使用,以
设置退出值,或检查系统错误字符串
对应于错误n
,或还原$代码>到有意义的状态。(我的重点)
这就解释了为什么你不能做显而易见的事情:
#!/usr/bin/env perl
say_hi() or die "ERROR: sub say_hi had an issue: Details => $!\n";
sub say_hi{
my ($name) = @_;
unless ($name) {
$! = 'no name';
return;
}
print "Hi $name\n";
return 1;
}
这导致:
ERROR:sub say\u hi有一个问题:Details=>
考虑使用eval
/$@
:
#!/usr/bin/env perl
eval { say_hi() } or die "ERROR: sub say_hi had an issue: Details => $@\n";
sub say_hi{
my ($name) = @_;
$name or die "no name\n";
print "Hi $name\n";
return 1;
}
另见“
如果您遵循brian在回答该问题时的建议,您可以执行以下操作:
#!/usr/bin/env perl
use strict;
use warnings;
my $r = say_hi();
$r->{success}
or die sprintf "ERROR: sub say_hi had an issue: Details => %s\n", $r->{reason};
sub say_hi{
my ($name) = @_;
$name or return { success => 0, reason => 'Missing "name"' };
print "Hi $name\n";
return { success => 1 };
}
或者,您可以使用或等。perldoc-v$代码>:
引用时,$代码>检索C的当前值“errno
”
整数变量。如果<代码>$代码>被分配了一个数值,即
存储在“errno”中。当作为字符串引用时,$代码>生成
与“errno
”相对应的系统错误字符串
。。。分配给$代码>同样是短暂的。信息技术
可以在调用“die()
”操作符之前立即使用,以
设置退出值,或检查系统错误字符串
对应于错误n
,或还原$代码>到有意义的状态。(我的重点)
这就解释了为什么你不能做显而易见的事情:
#!/usr/bin/env perl
say_hi() or die "ERROR: sub say_hi had an issue: Details => $!\n";
sub say_hi{
my ($name) = @_;
unless ($name) {
$! = 'no name';
return;
}
print "Hi $name\n";
return 1;
}
这导致:
ERROR:sub say\u hi有一个问题:Details=>
考虑使用eval
/$@
:
#!/usr/bin/env perl
eval { say_hi() } or die "ERROR: sub say_hi had an issue: Details => $@\n";
sub say_hi{
my ($name) = @_;
$name or die "no name\n";
print "Hi $name\n";
return 1;
}
另见“
如果您遵循brian在回答该问题时的建议,您可以执行以下操作:
#!/usr/bin/env perl
use strict;
use warnings;
my $r = say_hi();
$r->{success}
or die sprintf "ERROR: sub say_hi had an issue: Details => %s\n", $r->{reason};
sub say_hi{
my ($name) = @_;
$name or return { success => 0, reason => 'Missing "name"' };
print "Hi $name\n";
return { success => 1 };
}
或者,您可以使用或等。$
是C的errno
的代理。errno
可以采用的值在中作为常量提供
很少这样做,主要是因为您仅限于为系统调用设计的错误代码。抛出异常或具有特定于模块的错误变量(例如,$DBI::err
)更为常见。$
是C的errno
的代理。errno
可以采用的值在中作为常量提供
很少这样做,主要是因为您仅限于为系统调用设计的错误代码。抛出异常或具有特定于模块的错误变量(例如,$DBI::err
)更为常见