【问题标题】:How to check status of previously executed command in perl如何在 perl 中检查先前执行的命令的状态
【发布时间】:2019-10-31 06:35:06
【问题描述】:

我对 Perl 完全陌生。我有一个 Perl 脚本,它检查与容器中运行的 oracle 数据库的连接。这是我的代码

#!/usr/bin/perl
use DBI;

$\="\n";

print "Connecting to DB..";


my $dbh = DBI->connect('dbi:Oracle:host=oracle;sid=ORCLCDB;port=1521', 'books_admin/MyPassword', '',{ RaiseError => 1, AutoCommit => 0 })or die print ("could not connect! $DBI::errstr \n");

使用这个脚本,我可以连接到 oracle 数据库。但是这个脚本没有向我的终端提供任何状态输出。如何检查脚本是否连接到数据库?我知道 bash 有 $?用于检查先前执行的 cmd 的状态。我们在 Perl 中有类似的东西吗?

这就是我想要的 连接OK时输出“Successfully connected to Oracle-db”,脚本无法连接数据库时输出失败状态

注意:此代码向我的终端提供错误状态。 我的 Perl 版本是 v5.16.3

【问题讨论】:

  • 如果您将命令放在eval 块中,您可以使用$@ 捕获输出——参见perldoc.perl.org/functions/eval.html
  • 细读perlvar 以获得各种好东西(其中$?)。否则,它取决于库/函数(等)及其行为方式;因此,请阅读文档以了解他们在失败时会做什么,然后使用它。此外,复杂的库(如DBI)通常有特定的方法来查询状态。
  • @richyen eval 块和 $@ 如果块中的代码抛出异常 (dies) 很有用,因为我们得到了控制权(程序没有终止) ;异常被“捕获”。如果没有引发异常,$@ 中应该没有任何内容,因此它不能用于对先前命令状态的一般查询(参见Error Variables in perlvar)。许多(大多数)库不会在错误时抛出(die),但(可能)设置$?(可能还有其他相关的全局变量,请参阅perlvar)并可能返回代码。

标签: oracle perl perlscript


【解决方案1】:

documentation for the connect() method 是这样说的:

与请求的$data_source 建立数据库连接或会话。如果连接成功,则返回一个数据库句柄对象。使用$dbh->disconnect 终止连接。

如果连接失败(见下文),它将返回undef 并同时设置$DBI::err$DBI::errstr。 (它没有显式设置$!。)一般应该测试connect的返回状态,如果失败则打印$DBI::errstr

所以你的代码可能很明显:

my $dbh = DBI->connect(...);
if ($dbh) {
  say 'Connection ok';
} else {
  die "Connection error: $DBI::errstr";
}

但是,您使用的是RaiseError => 1,因此您的程序将die 而不是返回undef。因此,如果您的程序超过了那条线,您就知道连接成功了。

my $dbh = DBI->connect(...);
say 'Connection ok';

【讨论】:

    猜你喜欢
    • 2018-05-12
    • 1970-01-01
    • 2019-09-13
    • 2023-03-03
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多