我正在编写一个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;返回空白输出
答案 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;
的两个参数都是小写的。