2014-02-13 3 views
0

Я хочу получить значения из файла info.log и сравнить их со строкой в ​​$upper.Perl, чтобы получить шаблон из файла

Это то, что я пытался

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, но это так?

+6

'-e $ string' проверяет, существует ли файл с именем' $ string'. Вы не сравниваетесь с содержимым info.log. – Barmar

+0

Почему этот вопрос помечен 'bash'? – Barmar

+1

Что сказал @Barmar и почему он не печатает 'ss4', когда' $ upper' является 'S14' (если он * * сравнивал строки, а это не так)? Sloooow down – Madbreaks

ответ

1

правильный способ сделать это было бы:

open (FILE, "< info.log") or die "error msg"; 
while (<FILE>) 
{ 
    if (/$upper/) { 
     MATCH CASE 
    } 
} 

В основном вы цикл через файл и проверить каждую строку. Поскольку вы читаете файл, вам не нужна переменная (подразумевается $ _). на чеке.

-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 
    } 
} 
+0

Если вы собираетесь скопировать * все * из файла в массив Perl, пожалуйста, сначала проверьте размер файла: он может не содержать того, что вы думаете. – Borodin

+0

1) OP показывает только строчные буквы. Как скрипт соответствует этим? Кроме того, как бы вы не смогли совместить возможный «SS14» в файле OP, если предположить, что дело не является проблемой? – Kenosis

1

Прежде всего, вы должны всегда начать каждый программы Perl с use strict и use warnings.

Как отметили другие люди, оператор -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; 
    } 
} 
Смежные вопросы