Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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_Return - Fatal编程技术网

在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;
}
如何设置$的内容,以便在函数返回后使用。我正在尝试做一些类似的事情

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
)更为常见