以下Perl示例是长Perl脚本的一部分。
此脚本从ifconfig -a
获取结果并打印IP地址。
有人可以解释$1
如何获取IP地址吗?
正则表达式是什么
$RESULTS =~ /addr:(\S+)\s+/
装置?
my $COMMAND = "ifconfig -a | grep inet | grep -v 127.0.0.1 | head -1";
my $RESULTS = `$COMMAND`;
chomp $RESULTS;
# inet addr:106.13.4.9 Bcast:106.13.4.255 Mask:255.255.255.0
# inet 106.13.4.9 netmask ffffff80 broadcast 106.13.4.127
if ( $RESULTS =~ /addr:(\S+)\s+/ ) {
$IpAddress = $1;
}
elsif ( $RESULTS =~ /inet\s+(\S+)\s+/ ) {
$IpAddress = $1;
}
print "IpAddress = $IpAddress\n";
答案 0 :(得分:5)
如果=~
匹配表达式为真,则特殊变量$1
,$2
,...将是与括号中的模式部分匹配的子字符串。 $1
匹配左括号,$2
左括号,依此类推。
\S
匹配任何非空白字符,
+
匹配1次或更多次,
\s
匹配任何空白字符(空格,制表符,换行符),
因此,在你的正则表达式中,它匹配addr:(any non-whitespace character 1 or more time)matches any whitespace character one or more time
。并$1
捕获括号中的值。
请参阅此问题以了解$1
:What does $1 mean in Perl?
答案 1 :(得分:1)
=~
是perl中的匹配运算符,如果字符串(此处$RESULTS
)可以与正则表达式匹配(此处/addr:(\S+)\s+/
)
当在perl中匹配正则表达式时,会自动赋值变量:
$&
保存与整个表达式匹配的部分$1
保存与第一个捕获组(一组parantheses)匹配的部分$2
第二个捕获组的部分答案 2 :(得分:1)
$1
,$2
,$&
等会捕获上次成功匹配的值。
\S+
匹配任何并否定\s
(空白)。