it-swarm.dev

Perl中$ 1的含义是什么?

Perl中$ 1的含义是什么?此外,$ 2是什么意思?有多少$ number变量?

59
Chad DeShon

如果匹配成功,$number变量包含匹配捕获组的字符串部分( ... )在您的上一次正则表达式匹配的模式中。

例如,采用以下字符串:

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

声明之后

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

$1等于文本“brown”。

63
rlbond

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

my $string = 'abcdefghi';

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

在使用$ 1之前,请务必测试匹配或替换是否成功,依此类推。否则,您可能会从另一个操作中获取剩余物。

Perl正则表达式记录在 perlre 中。

33
Jim Puls

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

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

问题的一个示例 - $ 1在以下两个打印语句中包含“快速”:

#!/usr/bin/Perl

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

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

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

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

给定输入:111 222

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

1美元是111

2美元是222

人们还可以说:

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

$ + {myvara}是111

$ + {myvarb}是222

9
Einstein

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

更多信息: http://cslibrary.stanford.edu/108/EssentialPerl.html

(CTRL-F代表'匹配变量'找到相应的部分)

6
John T

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

perldoc perlvar

但是,当您以1美元等搜索此文档时。除了关于这些“数字”变量的部分之外,您将在许多地方找到引用。你必须搜索

$<digits>

我会把这个添加到 Brian的答案 通过评论或编辑,但我没有足够的代表。如果有人添加此内容,我将删除此答案。

2
benrifkah

既然你问了捕获组,你可能也想知道$ + ..很有用..

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

OUTPUT:
$ VAR1 ='hi';
$ VAR1 ='ih';
$ VAR1 ='再见';
$ VAR1 ='eyb';

2
Hemanth Gowda

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

0
Brad Gilbert

变量$ 1 .. $ 9也是只读变量,因此您无法隐式为它们赋值:

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

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

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

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

以上也会返回错误。

0
user118435