曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5591|回复: 0
打印 上一主题 下一主题

捕获变量($1, $2, $3 ...)

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2011-9-27 17:13:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
模式里使用圆括号可以表示
模式分组
还拥有捕获功能。捕获功能是指,把圆括号中模式所匹配的字符串存储在捕获变量里。这些捕获变量的名字如 $1, $2, $3 ...有多少对圆括号模式的匹配,就有多少个这样的变量。

$1 , $2 这样的捕获变量和模式匹配过程中的反响引用 \1, \2 的区别是,前者是模式全部匹配完成后存储的结果,而后者是匹配仍然进行中。简单的说,后者只能用于匹配模式中,而不能用于匹配完成后的打印或者存储等功能。

测试代码:
[Perl] 纯文本查看 复制代码
#!/usr/bin/perl

$_ = "welcome to groad.net";

if (/ (\w+\.net)/) {
        print "$1 \n";
}


运行输出:
# ./capture.pl
groad.net


也可以一次捕获多个字符串:
[Perl] 纯文本查看 复制代码
#!/usr/bin/perl

$_ = "welcome to groad.net";

if (/(\S+) (\S+) (\S+)/) {
        print "$1 $2 $3\n";
}


运行输出:
# ./capture.pl
welcome to groad.net


有时会产生空匹配变量:
[code=perl]#!/usr/bin/perl
$google = "google is 13 years old.\n";

if ( $google =~ /(\d*) years/ ) {
        print "$1 years\n";
}

$google = "google is thirteen years old.\n";
if ( $google =~ /(\d*) years/ ) {
        print "$1 years\n";
}
[/mw_shl_code]

运行输出:
# ./capture.pl
13 years
years

捕获变量的生命周期
上面的捕获变量有其生命周期,它们能够存活到下次再次匹配为止为止。比较下面的代码:
[code=perl]#!/usr/bin/perl

if (/(\S+) (\S+) (\S+)/) {
        print "$1 $2 $3\n";
}

if (/ (\w+\.net)/) {
        print "$1 $2 $3\n";
}

if (/ (\w+\.Net)/) {
        print "$1 $2 $3\n";
}
[/mw_shl_code]
运行输出:
# ./capture.pl
welcome to groad.net
groad.net
注意,从上面输出看到,当再次做匹配比较时,不管匹配或者不匹配,之前的捕获变量均已被清空。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-7-4 08:30 , Processed in 0.080551 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表