Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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
Regex DBI.pm中的这一行是做什么的?_Regex_Perl - Fatal编程技术网

Regex DBI.pm中的这一行是做什么的?

Regex DBI.pm中的这一行是做什么的?,regex,perl,Regex,Perl,我不明白$dsn=~s/^dbi:(\w*?)(?:\(.*))?://我是干什么的,对'=~/()/的怀疑更多,对我来说似乎没用。等于tilde,或者=~,是最重要的 尝试以下代码--将其放入文件中,使用chmod+x使其可执行,然后运行它: 603 $dsn =~ s/^dbi:(\w*?)(?:\((.*?)\))?://i or '' =~ /()/; # ensure $1 etc are empty if match fails

我不明白
$dsn=~s/^dbi:(\w*?)(?:\(.*))?://我是干什么的,对
'=~/()/
的怀疑更多,对我来说似乎没用。

等于tilde,或者
=~
,是最重要的

尝试以下代码--将其放入文件中,使用
chmod+x
使其可执行,然后运行它:

603   $dsn =~ s/^dbi:(\w*?)(?:\((.*?)\))?://i
                         or '' =~ /()/; # ensure $1 etc are empty if match fails
它将输出
匹配项

例如,它检查连接字符串的格式是否正确,并提取数据库名称等:

#!/usr/bin/perl

$mystring = "Perl rocks.";

if ($mystring =~ /rocks/) {
  print("Matches");
} else {
  print("No match");
}

Ouptuts
数据库\u名称:主机\u名称:端口

从代码中的注释可以清楚地看出:

print($dsn);

$dsn = "dbi:SQLPlatform:database_name:host_name:port";

$dsn =~ s/^dbi:(\w*?)(?:\((.*?)\))?://i
                             or '' =~ /()/; # ensure $1 etc are empty if match fails

print($dsn);

如果您在理解
s/
m/
如何工作时遇到问题,请参见和。

第一部分是提取dsn字符串的两部分,格式如下:

dbi:第一个匹配(可选第二个匹配):

这些匹配项将放在
$1
$2
中,以便在以后的代码中使用。第二部分仅在比赛不成功时运行。这是通过使用
实现的,如果第一个表达式成功,这将使第二个表达式短路(即不执行)


正如注释非常简洁地说的,它确保
$1
$2
等为空。假设以后的代码可以检查它们,如果没有设置它们(即无法从dsn字符串中提取),则会产生适当的错误。

如果捕获匹配失败,$1可能仍然包含一个值;同一动态范围中最后一次成功匹配捕获的值,可能来自以前的某个regexp。作者似乎不希望此时失败的匹配在$1中留下以前regexp中的一些值。为了防止这种情况发生,他强制“将始终成功”捕获匹配,而在捕获参数中未指定任何内容。这意味着将有一个匹配,并捕获空字符串。换句话说,$1现在将为空,而不是包含以前成功匹配的匹配值

一个更常见的习惯用法是,在执行依赖于$1值的任何代码之前,只需测试匹配成功,如下所示:

602     # extract dbi:driver prefix from $dsn into $1
603     $dsn =~ s/^dbi:(\w*?)(?:\((.*?)\))?://i
604             or '' =~ /()/; # ensure $1 etc are empty if match fails
虽然这通常是最简单的方法,但不幸的是,代码有时并不简单,将该测试强制到一些复杂的代码中可能会使棘手的部分更难处理。在这种情况下,确保$1在失败的匹配之后不包含任何内容可能比确保它在失败的匹配之前包含的内容更容易


我觉得这是个好问题。在Perl POD中,查找匹配失败后#$1行为的文档并不容易。我相信在骆驼书或骆驼书中可以找到更为详尽的解释。但是我现在还没有找到答案来检查。

到目前为止,答案中还没有找到神秘的
或“=~/()/
的原因。如果没有这些技巧,如果比赛失败,1美元将是未定义的。该代码可能在此匹配后不久在串联或字符串中使用$1。如果
Use warnings
有效,在未定义$1的情况下执行此操作将导致“在串联(.)或字符串中使用未初始化的值$1”警告。如果正则表达式不匹配,则使用
或“=~/()/
技巧将定义$1(但为空)。这样可以防止使用$1的代码溢出


如果匹配失败,注释
#确保$1 etc为空
不正确。去掉那个“etc”,评论是正确的。此操作设置$1,并且仅设置$1。此代码未设置$2$如果正则表达式不匹配,则2将是未定义的。

我不理解下行投票。如果这是comp.lang.perl.misc,那么可能会有5个人试图解释正则表达式的怪兽,而不是让OP阅读手册。实际上,我喜欢这个问题。虽然注释应该足以解释,但如果不理解$1在匹配失败后的行为,它可能仍然不是“平淡无奇的”。
if( /(match)/ ) {
    say $1;
}