我想从文件info.log
中提取值,并将它们与$upper
中的字符串进行比较。
这是我试过的
my $upper = "S14";
open(my $file, "<", "info.log") or die "Can't open info.log: $!";
my $string = $upper;
while (<$file>) {
if ( ! -e $string) {
print " print here $string\n";
}
}
我的文件看起来像这样
ss1
ss2
ss3
ss4
ss5
ss6
ss7
ss8
程序输出文件的所有内容。它应该没有打印ss4
,但确实如此?
答案 0 :(得分:1)
执行此操作的正确方法是:
open (FILE, "< info.log") or die "error msg";
while (<FILE>)
{
if (/$upper/) {
MATCH CASE
}
}
基本上你循环遍历文件并检查每一行。因为您正在读取文件,所以不需要变量(隐含了$ _)。在检查案件上。
答案 1 :(得分:1)
首先,您必须始终使用use strict
和use warnings
启动每个 Perl计划。
正如其他人所说,-e
运算符表示该名称的文件是否存在。它不会检查一个字符串是否出现在另一个字符串中。
有几种方法可以做到这一点。我会使用正则表达式,但不知道你正在处理什么类型的数据,并且为了避免让你感到困惑,我已经使用index
function编写了一个解决方案,如果第二个字符串出现则返回零或更多在第一个。
use strict;
use warnings
my $file = 'info.log';
my $upper = 'S14';
open my $fh, '<', $file or die "Can't open '$file': $!";
my $string = $upper;
while (<$fh>) {
if (index($_, $string) >= 0) {
print "This file contains '$string'\n";
last;
}
}
答案 2 :(得分:-1)
如果您只想搜索匹配项,请更快地使用grep。否则用foreach迭代。
my $upper="S14";
open(my $file, "<", "info.log") or die "Can't open info.log: $!";
my $string = $upper;
my @lines = <$file>;
my @matches grep { $_ =~ /$string/ } @lines; #searching *faster
foreach (@lines) { #iterating
chomp; #new line stuff
if($_ =~ /^$string$/is){
#stuff
}
}