【问题标题】:Perl regular expression and argumentsPerl 正则表达式和参数
【发布时间】:2015-07-07 10:53:09
【问题描述】:

以下 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";

【问题讨论】:

    标签: linux perl


    【解决方案1】:

    如果 =~ 匹配表达式为真,则特殊变量 $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 只使用 IP 地址而不是所有的 addr:106.13.4.9 字符串?
    • 因为$1 只存储括号内的内容而不是括号外的内容。查看给定的链接,您将了解$1 的行为。
    【解决方案2】:

    =~ 是 perl 中的匹配运算符,如果字符串(此处为 $RESULTS)可以与正则表达式(此处为 /addr:(\S+)\s+/)匹配,则计算结果为 true

    perl中匹配正则表达式时,会自动分配变量:

    • $& 持有整个表达式匹配的部分
    • $1 保存与第一个捕获组(括号集)匹配的部分
    • $2第二个捕获组的部分
    • 等等...

    【讨论】:

    • 能否请您解释一下 exp 中的语法(如 \S+ 和 \s+/ )等
    • $0 包含包含正在执行的 perl 脚本的文件的名称。 $& 返回整个匹配的字符串。
    • \S+ 表示“1 个或多个非空白字符”,\s+ 表示“1 个或多个空白字符”,正斜杠只是标记正则表达式开头和结尾的分隔符,括号捕获与其中的模式匹配的内容并将其存储在 $1 在这种情况下,其余的是文字字符。此正则表达式用于捕获 addr: 之后直到第一个空白字符(例如 106.13.4.9)的所有内容。
    【解决方案3】:

    $1$2$& 等将捕获最后一次成功匹配的值。

    \S+ 匹配任何并否定\s(空格)。

    【讨论】:

    • & 不用于捕获任何内容。如果你想写and,那么写and。 perl中&有特殊含义。
    • 我错过了$。我的意思是 $&
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    相关资源
    最近更新 更多