$ 1在Perl中意味着什么?


69

$ 1在Perl中意味着什么?此外,$ 2是什么意思?有多少个$ number变量?


4
您可能会做得很好,例如学习Learning Perl或其他Perl简介,这些东西可以解释该语言的基本知识。
brian d foy

现在,布莱恩,您为什么要推荐那本书?僧侣毕竟是一个慈善机构....
约翰·怀特

Answers:


71

$number变量包含字符串匹配的部分捕捉组 ( ... )的图案为你最后的正则表达式匹配,如果匹配成功。

例如,使用以下字符串:

$text = "the quick brown fox jumps over the lazy dog.";

声明后

$text =~ m/ (b.+?) /;

$1等于文本“ brown”。


2
如果有不止一场比赛怎么办?我们能以某种方式获得所有比赛吗?
user1289

@ user1289就是其他数字($ 2,$ 3等)的用途。
Alecg_O

@ user1289-您的正则表达式需要多个括号才能捕获多个值。您不能只使用一个捕获条件(ex m /(b。?)/)来捕获以“ b”开头的字符串中的所有单词(前面的示例仅捕获第一个实例)。
DemiImp '20

我认为提到所有捕获变量($ 1,$ 2等)都在本地范围内也很重要。离开块后,它们是不确定的。
DemiImp

36

数字变量是您应用的最后一个成功匹配或替换运算符的匹配:

my $string = 'abcdefghi';

if ($string =~ /(abc)def(ghi)/) {
    print "I found $1 and $2\n";
}

在使用$1等之前,请始终测试匹配或替换是否成功。否则,您可能会从其他操作中提取剩余物。

Perl正则表达式记录在perlre中


如果$ 1到$ 9始终存在,那么少于9个匹配项有什么价值?
乍得DeShon 2009年

4
$ 1到$ 9并不总是存在。我认为Jim误读了手册页。我引用了相关的部分:“您可以根据需要添加多个括号。如果您有9个以上的子字符串,则变量$ 10,$ 11,...引用相应的子字符串。在模式中,\ 10,\ 11等,如果在反向引用之前至少有很多左括号,请返回子字符串;否则(出于向后兼容性考虑)\ 10与\ 010(退格)相同,\ 11与\ 011(制表符)相同等等((\ 1到\ 9始终是反向引用。)”
Alan Haggai Alavi 2009年

2
-1为太多的真相。它们是捕获的结果,而不是整个比赛。它们仅在成功匹配时设置,这意味着您需要在使用它们之前检查匹配是否成功。正如Alan已经指出的那样,您已经使备用反斜杠表示法的特殊情况行为感到困惑。
Michael Carman

5
我已经完全用事实代替了答案。原始答案中的几乎所有内容都是错误的。
brian d foy

12

$ 1,$ 2等将包含上次成功匹配的捕获值-重要的是在访问捕获之前检查匹配是否成功

 if ( $var =~ m/( )/ ) { # use $1 etc... }

问题的一个例子-$ 1在下面的两个打印语句中都包含“ Quick”:

#!/usr/bin/perl

'Quick brown fox' =~ m{ ( quick ) }ix;
print "Found: $1\n";

'Lazy dog' =~ m{ ( quick ) }ix;
print "Found: $1\n";

10

正如其他人指出的那样,$ x是正则表达式的捕获变量,允许您引用匹配模式的各个部分。

Perl还支持命名捕获,这在某些情况下可能使人类更容易记住。

给定输入:111222

/(\d+)\s+(\d+)/

$ 1是111

$ 2是222

也可以说:

/(?<myvara>\d+)\s+(?<myvarb>\d+)/

$ + {myvara}是111

$ + {myvarb}是222


6

这些称为“匹配变量”。如前所述,它们包含您上一次正则表达式匹配中的文本。

更多信息在Essential Perl中。(Ctrl+F用于“匹配变量”以找到相应的部分。)


3

由于您询问了捕获组,因此您可能也想了解$ +

use Data::Dumper;
$text = "hiabc ihabc ads byexx eybxx";
while ($text =~ /(hi|ih)abc|(bye|eyb)xx/igs)
{
    print Dumper $+;
}

输出:
$ VAR1 ='hi';
$ VAR1 ='ih';
$ VAR1 ='再见';
$ VAR1 ='eyb';


2

通常,有关Perl中“魔术”变量的问题可以通过查看Perl预定义变量文档中的la来回答:

perldoc perlvar

但是,当您在本文档中搜索$ 1等时,您会在许多地方找到引用,但这些“数字”变量的内容除外。您必须搜寻

$<digits>

我本可以通过评论或编辑将其添加到Brian的答案中,但是我没有足够的代表。如果有人添加了此内容,我将删除此答案。


是的,也许应该将其转移到Brian的答案中(由信誉得分超过2000的人使用-建议的编辑实际上不适用于此类更改)。您也可以通过在Brian的评论中留下评论来ping通。
彼得·莫滕森

0

变量$ 1 .. $ 9也是只读变量,因此您不能为它们隐式分配值:

$ 1 ='foo'; 打印$ 1;

这将返回错误:在脚本行1尝试修改只读值。

您也不能在变量名的开头使用数字:

$ 1foo ='foo'; 打印$ 1foo;

上面的内容也会返回错误。


关于“隐式”:您不是说“显式”(相反)吗?
彼得·莫滕森

0

我怀疑2**32 -1在32位编译的Perl二进制文件上可以有多达编号的匹配变量。


是的,这确实回答了三个问题中的最后一个。但是也许增加一些实用性?
彼得·莫滕森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.