曲径通幽论坛

标题: 捕获变量($1, $2, $3 ...) [打印本页]

作者: beyes    时间: 2011-9-27 17:13
标题: 捕获变量($1, $2, $3 ...)
模式里使用圆括号可以表示
模式分组
还拥有捕获功能。捕获功能是指,把圆括号中模式所匹配的字符串存储在捕获变量里。这些捕获变量的名字如 $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
注意,从上面输出看到,当再次做匹配比较时,不管匹配或者不匹配,之前的捕获变量均已被清空。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2