在Perl正则表达式运算符中使用变量或关联数组进行文件输入

时间:2015-08-12 11:20:41

标签: regex perl

我正在编写一个perl脚本来仅过滤/ etc / passwd中与我的登录名匹配的记录。但是当我在" / /"之间包含变量或哈希表时要与模式匹配运算符匹配,它只适用于标准输入,如果我将/ etc / passwd filename参数传递给我的perl脚本,则返回空结果。如何解决这个问题?

#!/usr/bin/perl -w
while (<>) {
    my $x = `logname`;
    #if ($_ =~ /$x/) {
    if ($_ =~ /$ENV{'LOGNAME'}/) {
       print $_;
    }
}

./ test.pl / etc / passwd ==&gt;返回空白输出

1 个答案:

答案 0 :(得分:3)

鲍罗丁是对的,无论我做什么,你的剧本都适合我......

cat /etc/passwd | ./test.pl

...或

/test.pl /etc/passwd

然而,有些事情......如果你这么倾向,你的剧本可以缩短到这个......

while (<>) {
    print if /$ENV{USER}/;
}

Perl高尔夫球手可能会进一步缩短,但这种情况差不多就像我喜欢的那么短,但仍然很明显。

如果(正如Borodin所建议的那样)你的用户名中有一些正在抛出正则表达式的字符......你可以用quotemeta( $ENV{USER} )转义元字符,或者最好不要使用a(比较昂贵) )当你只是匹配一个子字符串时正则表达式...而是使用index函数...

while (<>) {
    print if index( $_, $ENV{USER} ) != -1; 
}

index内置函数返回子字符串出现的索引(例如,out出现在bout索引1,并出现在throughout中}如果没有出现子字符串,则返回7

修改

我忘了用-1函数提一点 gotcha ...它区分大小写。如果你希望它不区分大小写,那么最好的方法就是强制你的参数上的大小写是相同的,就像这样......

index

在这个例子中,我强制print if index( lc($_), lc($ENV{USER}) ) != -1; 的两个参数都是小写的。