用于正则表达式匹配的Perl特殊变量

时间:2014-08-06 20:22:31

标签: regex perl

我想使用perl的一个特殊变量来使这个代码段变得不那么大和丑陋:

    my $mysqlpass = "mysqlpass=verysecret";
    $mysqlpass = first { /mysqlpass=/ } @vars;
    $mysqlpass =~ s/mysqlpass=//;

我已查看此信息并尝试了几个特殊变量($',$ 1,$`等)无济于事

3 个答案:

答案 0 :(得分:2)

如果s///替换了某些内容,则m//将返回true。

因此,可以简单地将这两个语句组合起来,而不是使用冗余use strict; use warnings; use List::Util qw(first); chomp(my @vars = <DATA>); my $mysqlpass = first { s/mysqlpass=// } @vars; print "$mysqlpass\n"; __DATA__ mysqluser=notsosecret mysqlpass=verysecret mysqldb=notsecret

verysecret

输出:

$_

一个警告

由于@vars是原始数据结构的别名,因此替换也会影响@vars值。

使用拆分

的备选方案

为了避免这种情况,我会询问use strict; use warnings; chomp(my @vars = <DATA>); my %vars = map {split '=', $_, 2} @vars; print "$vars{mysqlpass}\n"; __DATA__ mysqluser=notsosecret mysqlpass=verysecret mysqldb=notsecret 是否只包含由等号分隔的键值对。如果是这种情况,那么我建议简单地将该数组转换为哈希值。

这样可以更轻松地拉出所有键:

verysecret

输出:

{{1}}

答案 1 :(得分:2)

是的,正则表达它,如果你真的想要访问混淆的路径。 请参阅以下代码:

my $string = "mysqlpass=verysecret";
if ($string =~ /^(\w+)\=(\w+)$/) {
    print $1; # This stores 'mysqlpass'
    print $2; # This stores 'verysecret'
}

我对此的建议是,您希望您的代码可读。

答案 2 :(得分:0)

您正在寻找的是$_