【转】Perl的die、warn、eval函数

OpenClaw 完整部署教程 版本:OpenClaw 2026.2.13更新日期:2026-02-26适用系统:Linux (Ubuntu/Debian/CentOS) 阅读详情

在Windows中,不能使用 or die $!.


die函数

18.4 错误处理

在很多情况下,系统调用可能会失败;例如,尝试打开不存在的文件,或者删除某个仍含有文件的目录,或者尝试读取没有读权限的文件。在前面的示例中,我们已经用到了die函数,本节将 详细讨论有关错误处理和错误处理函数的相关内容。这些函数包括die函数、warn函数和eval函数。

die函数用于在命令或文件句柄失败时退出Perl脚本。

warn函数类似于die函数,但它不会退出脚本。

eval函数具有多种用途,但它主要还是用于异常处理。

读者想必还记得短路运算符&&和||,这两个运算符首先会求其左侧操作数的值,然后才会求其右侧操作数的值。如果&&左侧操作数值为true,则求其右侧的操作数。如果||左侧操作数的值为 false,这才求其右侧的操作数。

Carp.pm模块。 有很多种退出脚本的途径可供用户选择。Perl 5提供的Carp模块扩展了die和warn的功能。(详见示例12.10。)

18.4.1 die函数

如果系统调用失败的话,die函数会把字符串打印到STDERR上,并以$!的当前值退出脚本。$!变量中含有errno的当前值,后者是一个UNIX全局变量,含有一个表示系统错误的数字。只有在系 统调用失败时才会更新errno的值。当系统调用失败时,会向errno赋予一个数字代码,以表明错误的类型。如果在字符串中省略了换行符,则会打印出带有行号的消息(参 见/usr/include/sys中的完整列表)。

下面是/usr/include/sys/errno.h文件中的示例:

#define EPERM 1 /* Not owner */#define ENOENT 2 /* No such file or directory */#define ESRCH 3 /* No such process */#define EINTR 4 /* Interrupted system call */#define EIO 5 /* I/O error */

Win32的错误代码不同于UNIX错误代码,因此不能依赖于$!返回的值。有很多Win32扩展都提供了自己的错误函数,以便为用户提供更有意义的结果。详情可参阅ActiveState中标准Perl库里的 Win32::GetLastError相关文档。

格式

die(LIST)die LISTdie

示例18.66



(In Script)1 die "Can't cd to junk: $!\n" unless chdir "/usr/bin/junk";(Output)1 Can't cd to junk: No such file or directory


解释

1. chdir调用失败。$!中含有来自errno的错误消息。换行符导致打印了die函数后面的字符串,该字符串中含有变量$!的值。

示例18.67


(In Script)1 die unless chdir '/plop' ;(Output)1 Died at croak.perl line 4.


解释

1. chdir调用失败。这一次$!并不在die字符串中,打印发生错误的行。

示例18.68


(In Script)1 chdir '/plop' or die "Stopped";(Output)1 Stopped at croak.perl line 4.


解释

1. 本示例的输出内容与前一个示例相同,但它使用的不同的语法。如果chdir调用失败,就执行or右边的die函数。



warn函数

warn 函数(运算符)和die几乎一样,所不同的是前者会让程序继续运行。如果在eval块中调用die函数,则传递给die的参数字符串将同样赋值给特殊变量$@。在调用die之后,该变量可以作为一个参数传递给warn函数,其输出将发送到STDERR上(参阅"ecal函数"一节)。


eval函数


eval函数用于处理异常,即捕捉错误。位于eval之后的语句块是作为单独的Perl程序来处理和解析的,但其所有的变量设置、子例程以及格式定义都将保持到eval执行完毕。

eval函数返回的值是上一个表达式的值。如果出现了编译或运行时错误,或者执行了die语句的话,则会返回未定义的值,并将特殊变量$@设置为错误消息内容。如果没有发生错误,则$@将是空字符串。

借助eval求Perl表达式的值

示例18.69

(The Script)#!/bin/perl# The eval function will evaluate each line you type# and return the result. It's as though you are# running a little independent Perl script.# Script name: plsh1 print "> "; # Print the prompt2 while(<STDIN>){3 $result=eval ; # eval evaluates the expression $_4 warn $@ if $@; # If an error occurs, it will be assigned toprint "$result\n if $result";6 print "> "; # Print the prompt}(Output)(The Command line)$ plsh2 > hello5 hello2 > bye5 bye2 > 5 + 45 92 > 8 / 35 2.666666666666672 > 5 / 04 Illegal division by zero at (eval 5) line 3, <STDIN> line 5.> "Oh I seeCan't find string terminator '"' anywhere before EOF at (eval 6)line 1, <STDIN> line> exit

解释

1. 本行向用户打印出一个提示信息。该程序类似于小型Perl shell。它能帮助用户在把表达式放进程序之前检查它的好坏,特别是在不确定Perl会如何处理该表达式时。

2. 进入while循环。每次进入循环时,就从用户处读取一行输入,并赋值给$_。

3. 不带参数的eval将对$_中的表达式求值,并将求值结果赋予$result。

4. 如果eval发现了求值表达式引起的语法错误或系统错误的话,就将返回的错误信息赋值给变量$@。如果没有发现错误,则把$@赋值为空字符串。

5. 如果对表达式求值成功,打印其结果。

6. 显示提示信息,并再一次进入循环。

使用eval捕捉程序中的错误

示例18.70

(In Script)#!/bin/perlprint "Give me a number.";chop($a=<STDIN>);print "Give me a divisor.";chop($b=<STDIN>);1 eval{ die unless $answer = $a/$b ; };2 warn $@ ifprintf "Division of %.2f by %.2f is %.2f.\n",$a,$b,$answer if $answer ;4 print "I'm here now. Good-day!\n";(Output)Give me a number.45Give me a divisor.63 Division of 45.00 by 6.00 is 7.50.4 I'm here now. Good-day!(Output)Give me a number.5Give me a divisor.02 Illegal division by zero at ./eval.p line 8, <STDIN> line 2.4 I'm here now. Good-day!

解释

1. eval函数会计算除法($a/$b),并将结果保存到$answer中。请注意,必须首先在eval中使用$answer,该会一直保留到eval执行结束。

2. 如果一切正常,并且除法运算顺利完成,则忽略这一行。如果发现错误(例如除以0),则将$@变量设置为系统错误信息,然后通过warn函数将消息打印到 STDERR,并恢复程序执行。如果在eval块中调用了die函数,则程序不退出,而是在退出eval块之后继续执行。

3. 如果运行成功,则打印除法运算的结果。

4. 打印该行内容只是为了说明,程序即使失败了也会继续执行,因为warn函数不会导致脚本退出。

eval函数和here文档

示例18.71


(The Script)#!/bin/perl1 eval<<"EOF";2 chdir "joker" || die "Can't cd: $!\n";3 EOF4 print "The error message from die:print "Program $0 still in progress.\n";(Output)4 The error message from die: Can't cd: no such file or directory5 Program ./eval4.p still in progress.


解释

1. here文档类似于一种特殊形式的引用。eval函数获得位于第一个EOF和最后一个EOF之间的所有内容。

2. 如果chdir函数调用失败,则调用die函数,并在here文档的最后一个EOF之后恢复程序。

3. EOF表明here文档到此结束。

4. 将die函数的错误消息保存在变量$@中。
5. 程序继续执行。


FreeRTOS-Plus-CLI使用笔记 FreeRTOS-Plus-CLI使用笔记 一、简介 详细介绍可参考FreeRTOS-Plus-CLI官网地址入口 FreeRTOS+CLI(Command Line Interface, 命令行接口)提供了一种简单、小型、可扩展且RAM高效的方法,使FreeRTOS应用程序能够处理命令行输入。添加一条指令的步骤如下: 提供一个实现命令功能的函数 将命令映射到该功能函数 注册命令 运行命令解释器 命令行调试接口对于排查分析出现的问题提供了很好的接口,可以通过查看传感器信息判断传感器是否正常,可以查看内置 阅读详情

相关推荐

从报错到优化:一次Gauss JDBC参数限制排查实录(32767参数上限避坑指南)

本文详细记录了排查GaussDB JDBC驱动因绑定参数数量超过32767上限而抛出`PSQLException`(报错信息为`Tried to send an out-of-range integer as a 2-byte value`)的全过程。文章深入分析了该限制的底层协议原理,并提供了应用层分批查询、使用临时表以及优化业务逻辑等多种解决方案,旨在帮助开发者规避此参数上限陷阱,构建更稳健的数据访问层。

rgv23456789的博客 192

perl中的die语法

if ( ! open LOG, '>>', 'logfile' ) {   die "cannot create logfile: $!"; } 如果open失败,die会终止程序的运行,并且告诉我们无法创建日志文件 $!:会给我们一个解释,如:fine not found之类的,也就是在c或其他语言里面调用perror取得的字符串。     这个解释性的系统错误信息保

娜然的专栏 1万+

Google Earth Engine:LandTrendr (Landsat Collection 2)全更新使用(代码调用+UI交互)

本文介绍了使用Landsat Collection 2进行连续变化监测的分析方法,包含代码实现和可视化界面两部分。代码部分通过Google Earth Engine平台运行LandTrendr算法,设置参数包括时间范围、光谱指数、变化检测阈值等,最终生成变化幅度和检测年份的可视化图层,并将结果导出至Google Drive。可视化界面部分展示了基于LandTrendr的土地覆盖变化结果,结合Landsat影像进行分析。整个方法实现了从数据处理到结果展示的完整流程,适用于森林覆盖等环境变化监测。

此星光明博客 186

perl函数说明(die)

die die LIST dieeval 之外,这个函数把 LIST 里的数值连接起来打印到 STDERR 并且带着当前的 $!(C 库的 errno 变量)的值退出。如果 $! 为 0,它就带着 $?>>8 值(这个值是从 system,wait,管道 close,或者 `commend` 退出的最后一个子进程的状态)退出。如果 $?>>8 为 0 ,那么该函数带着 255

紫轩阁 3004

perl ---die 函数

<br />在P e r l中,d i e函数可以用来在出现错误的时候停止解释程序的运行,并输出一条有意义的<br />出错消息。正如你在前面已经看到的那样,只要调用d i e函数,就能够输出类似下面的消息:<br />   died at scriptname line xxx<br /><br />d i e函数也可以带有一系列的参数,这些参数将取代默认消息而被输出。如果消息的后面<br />没有换行符,那么消息的结尾就附有at scriptname line xxx字样:<br />   die "C

zhangfn2011的专栏 1万+

perl的异常处理diewarneval函数--DBI的RaiseError

在很多情况下,系统调用可能会失败;例如,尝试打开不存在的文件,或者删除某个仍含有文件的目录,或者尝试读取没有读权限的文件。在前面的示例中,我们已经用到了die函数,本节将 详细讨论有关错误处理和错误处理函数的相关内容。这些函数包括die函数warn函数eval函数die函数用于在命令或文件句柄失败时退出Perl脚本warn函数类似于die函数,但它不会退出脚本

直到世界的尽头 1万+

perl die 常见用法

die JUtility->dump_object($slide); 将model 对象打印输出的方法 die JDB->get_global_sql(); 打印sql 语句输出情况 JDB->get_global_sql(1); 清除以前执行的sql //die 常见变量  die JUtility->dump_object($a); //di

xrl2012的专栏 1467

Perldiewarneval函数

die函数  18.4 错误处理  在很多情况下,系统调用可能会失败;例如,尝试打开不存在的文件,或者删除某个仍含有文件的目录,或者 尝试读取没有读权限的文件。在前面的示例中,我们已经用到了die函数,本节将 详细讨论有关错误处理和错 误处理函数的相关内容。这些函数包括die函数warn函数eval函数。  die函数用于在命令或文件句柄失败时

兴趣,激情 2676

无涯教程-Perl - warn函数

如果变量$@包含一个值(来自先前的eval调用),并且LIST为空,则$@的值将以。\t.caught打印。如果$@和LIST都为空,则。此函数将LIST的值打印到STDERR。基本上与die函数相同,除了不对出口进行任何调用并且在eval语句内不引发异常。这对于引发错误而不导致脚本过早终止很有用。无涯教程网提供描述此函数将LIST的值打印到STDERR。基本上与die函数相同,除了不对出口进行任何调用并...Perl 中的 warn函数 - 无涯教程网。以下是此函数的简单语法-此函数不返回任何值。

无涯教程 757

Perl——Error Handling

Perl编程语言中,错误处理是非常重要的一部分。错误处理能够帮助开发者有效地管理程序运行过程中可能出现的各种问题,比如文件操作失败、资源获取不到等。本文将详细介绍Perl中用于错误处理的三个关键函数:`die`、`warn` 和 `eval`。这些函数能够帮助程序员更好地理解和控制程序的行为,特别是在遇到错误时如何优雅地处理。

凢的博客 423

Perl一些函数

载:http://blog.sina.com.cn/s/blog_607254630101d3ae.html 一、进程处理函数 1、进程启动函数 函数eval 调用语法 eval_r(string) 解说 将string看作Perl语句执行。 正确执行后,系统变量$@为空串,如果有错误,$@中为错误信息。 例子 $print = "print (\"he

frt007的专栏 1971

Perl 错误处理

Perl 中,错误处理主要分为两大类:运行时错误和异常。运行时错误是指脚本在执行过程中遇到的错误,如语法错误、类型错误等。异常则是针对特定情况下的错误,如文件不存在、网络连接失败等。错误处理是 Perl 编程中不可或缺的一部分。掌握错误处理机制,可以帮助开发者更好地编写高质量的代码。本文介绍了 Perl 中的错误处理方法,包括运行时错误处理和异常处理,并提供了最佳实践建议。希望对您有所帮助。

lsx202406的博客 411

全面认识Perl进程处理函数

本文和大家重点学习一下Perl进程处理函数的概念,这里主要包括Perl进程启动函数Perl进程终止函数两部分内容,希望本文的介绍能让你有所收获。Perl进程处理函数1、Perl进程处理函数Perl进程启动函数函数eval调用语法eval(string)解说将string看作Perl语句执行。正确执行后,系统变量$@为空串,如果有错误,$@中为错误信息。例子$print="print(\"he

bravoon的专栏 1112

中级perl--用eval捕捉错误

有一些代码看上去很平常,但是却含有潜在的危险,一旦某种条件不对就会使程序中断,过早地结束程序。 my $average = $total / $count; # 除数为零 print "okayn" unless /$match/; # 正则表达式不合法 open MINNOW,‘>ship.txt’or die "Can‘t create ‘ship.txt’: $!"; # 文件句柄...

jinYwuM的博客 607

Perl异常处理方法总结

程序脚本在运行过程中,总会碰到这样那样的问题,我们会预知一些问题并为其准备好处理代码,而有一些不能预知。好的程序要能尽可能多的处理可能出现的异常问题,本文就总结了一些方法来解决这些异常,当然perl在这个处理了不及其它同类语言,但也不会差到那里。在开始前,我们先盘点一些关于perl的优缺点。0. 历史太悠久了。你可以在1997年的计算机上找到perl5.0。(只是吐槽一下,历史悠久没什么不好,与时俱

jackm1688的博客 4410

perl进程终止函数die/warn/exit/kill

函数名:die 调用语法:die (message); 解说:终止程序并向STDERR输出错误信息。message可以为字符串或列表。如果最后一个参数不包含换行符,则程序文件名和行号也被输出。 例子:die ("Cannot open input file"); 结果输出:Cannot open input file at myprog line 6.   函数名:w

longjing1113的专栏 1万+

perl中的die|warn|exit

1.die 用于输出用户自定义的错误信息,并终结perl程序的执行。如, if($ret == -1){ die "ret not zero!"; }输出结果为: ret not zero! at test.pl line 9. 2.warndie的用法类似,只是warn不会终结perl程序的执行。 3.exit 终结perl程序的执行,并返回指定

@_囚徒-2018_的家园 1965

perl函数说明(eval)

eval BLOCK eval EXPR eval eval 关键字在 Perl 里起两种不同的但相关的作用。这些目的是用两种形式的语法来表现的, eval BLOCK 和 eval EXPR。第一种形式捕获那些致命的运行时例外(错误),类似于 C++ 或 Java 里的 “try 块”。第二种形式在运行时实时地编译和执行一小段代码,并且也和第一种形式一样捕获任何例外。但是第二种形式比第一种形

紫轩阁 5667

Perl语言入门笔记 第五章 输入与输出(标准输入输出,文件句柄,printf,die,say)...

=pod #第五章 输入与输出 while(defined($line = <STDIN>)) #defined (xxx) xxx为undef则为假,否则为真 { print "I saw $line"; } while(<STDIN>) #while是一次读取一行,下次读取会忽略上一行,所以最好写while循环 { print ...

dietan8353的博客 425

Perl函数

一、进程处理函数1、进程启动函数函数eval 调用语法 eval(string) 解说 将string看作Perl语句执行。正确执行后,系统变量$@为空串,如果有错误,$@中为错误信息。 例子 $print = "print (\"hello,world\\n\");";eval ($print); 结果输出 hello, world 函数名 system 调用语法 system(l...

weixin_30609287的博客 262

Perl eval 函数探讨

   Perl eval 函数探讨     Perl 作为一种脚本语言可以实时地生成和执行代码。这种特性可以把代码的编译推迟到运行时,所以又称为“动态代码”。另外, Pe

EagleYIN417的专栏 1043

perl脚本中使用eval函数执行可能有异常的操作

perl脚本中使用eval函数执行可能有异常的操作

爱读庄子的码农 1084

Dell 服务器 H310 RAID卡 Windows 2003驱动

Dell 服务器 H310 RAID卡 Windows 2003驱动,内含USB光驱制作工具,进入2003安装界面后按F6加载安装阵列卡驱动。

郑君里上下册《信号与系统(第3版)》笔记和课后习题(含考研真题)详解.pdf

信号与系统第三版课后答案

上一篇: Qt安装之后出现qmake命令无法找到
下一篇: 0-1背包
newxbee
博客等级 码龄15年 1粉丝 5原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值