我想使用perl的一个特殊变量来使这个代码段变得不那么大和丑陋:
my $mysqlpass = "mysqlpass=verysecret";
$mysqlpass = first { /mysqlpass=/ } @vars;
$mysqlpass =~ s/mysqlpass=//;
我已查看此信息并尝试了几个特殊变量($',$ 1,$`等)无济于事
答案 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)
您正在寻找的是$_
。