【发布时间】:2010-11-05 09:31:01
【问题描述】:
$1 在 Perl 中是什么意思?此外,2 美元是什么意思? 有多少个 $number 变量?
【问题讨论】:
-
您最好查看类似Learning Perl 之类的内容或其他解释该语言基础知识的 Perl 简介。
-
现在布莱恩,你为什么要推荐那本书?僧侣毕竟是慈善机构....
$1 在 Perl 中是什么意思?此外,2 美元是什么意思? 有多少个 $number 变量?
【问题讨论】:
数字变量是您应用的最后一个成功匹配或替换运算符的匹配项:
my $string = 'abcdefghi';
if ($string =~ /(abc)def(ghi)/) {
print "I found $1 and $2\n";
}
在使用$1 等之前,始终测试匹配或替换是否成功。否则,您可能会从另一个操作中拾取剩余物。
Perl 正则表达式记录在perlre。
【讨论】:
$number 变量包含与 capture groups ( ... ) 匹配的字符串部分,如果匹配成功的话,您的最后一次正则表达式匹配。
例如,取如下字符串:
$text = "the quick brown fox jumps over the lazy dog.";
声明之后
$text =~ m/ (b.+?) /;
$1 等于文本“brown”。
【讨论】:
这些被称为“匹配变量”。如前所述,它们包含上次正则表达式匹配的文本。
更多信息在 Essential Perl 中。 (Ctrl + F for 'Match Variables' 找到相应的部分。)
【讨论】:
变量 $1 .. $9 也是只读变量,因此您不能为它们隐式赋值:
$1 = 'foo';打印 $1;
这将返回错误:在脚本第 1 行尝试修改只读值。
您也不能使用数字作为变量名的开头:
$1foo = 'foo';打印 $1foo;
上面也会返回错误。
【讨论】:
正如其他人所指出的,$x 是正则表达式的捕获变量,允许您引用匹配模式的部分。
Perl 还支持命名捕获,这在某些情况下可能更容易让人记住。
给定输入:111 222
/(\d+)\s+(\d+)/
$1 是 111
$2 是 222
也可以说:
/(?<myvara>\d+)\s+(?<myvarb>\d+)/
$+{myvara} 是 111
$+{myvarb} 是 222
【讨论】:
$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";
【讨论】:
我怀疑在 32 位编译的 Perl 二进制文件上可能有多达 2**32 -1 编号的匹配变量。
【讨论】:
既然您询问了捕获组,您可能也想知道$+... 很有用...
use Data::Dumper;
$text = "hiabc ihabc ads byexx eybxx";
while ($text =~ /(hi|ih)abc|(bye|eyb)xx/igs)
{
print Dumper $+;
}
输出:
$VAR1 = '嗨';
$VAR1 = 'ih';
$VAR1 = '再见';
$VAR1 = 'eyb';
【讨论】: