2014-11-06 4 views
0

Я пытаюсь распечатать каждую строку из файла, если они содержат один символ в определенной позиции, чтобы начать с этого символа «+», но я буду запускать ту же программу, -». Код работает, но не предоставляет вывод, я уверен, что это очень простая ошибка, поскольку я проверил регулярное выражение и это работает!Соответствует определенному символу, распечатайте, если найдено

FILE1 данных:

3628 -a 
9712 +T 
11004 -a 
11379 -a 
12715 +T 
14184 +T 

Выходные:

9712 +T 
12715 +T 
14184 +T 

Код:

#!/usr/bin/perl 

use strict; 
use warnings; 
use autodie; 

my $outputfile = "/Users/edwardtickle/Documents/indelfinal.txt"; 

open FILE1, "/Users/edwardtickle/Documents/indelcount.txt"; 

open (OUTPUTFILE, ">$outputfile"); 

while (<FILE1>) { 
    if (/^(\d+)\s+(\S)(\S)/) { 
    if ($2 =~ m/'+'/) { 
    print OUTPUTFILE "$1 $2$3\n"; 
    } 
} 
} 

close FILE1; 
close OUTPUTFILE; 

Ура!

ответ

4
if ($2 =~ m/'+'/) { 

Это регулярное выражение, поэтому оно не делает то, что вы думаете. Это будет соответствовать, если $2 (+ или - или что-то еще) содержит последовательность не менее двух апострофов (длина $2 всегда 1, поэтому этого никогда не может быть).

Вы хотите сравнение строк вместо:

if ($2 eq '+') { 
+0

Это блестяще, спасибо за быстрое решение! –

1

Следующая регулярное выражение может помочь вам determin + на предпоследнем (определенной) позиции в строке

m/\+.$/ 

Например

#!/usr/bin/perl 

use strict; 
use warnings; 
use autodie; 


open FILE1, "input"; 


while (<FILE1>) { 
    if ($_ =~ m/\+.$/) { 
    print "$_"; 
    } 
} 

close FILE1; 

будет производить выход как

9712 +T 
12715 +T 
14184 +T 

Что он делает?

  • \+ соответствует +

  • . соответствует любому одному символу

  • $ соответствует концу строки.

0

Похоже, что может только когда-либо один + или один - в вашем входе, так что нет никакого смысла в расщеплении строки на поля, прежде чем сделать тест. Это все, что вам нужно.

while (<FILE1>) { 
    print OUTPUTFILE $_ if /\+/; 
} 

или, в команде однострочного

perl -ne'print if /\+/' indelcount.txt > indelfinal.txt 

Обратите внимание, что в последнем случае требуется свой текущий рабочий каталог будет /Users/edwardtickle/Documents

0

Это дает то, что вы ожидаете

use warnings; use strict; 
open('new',"file1"); 
my @ar = <new>; 
my @vz = grep{m/\+/g} @ar; 
print @vz,"\n"; 

Я использовал оператора grep для соответствия определенному слову с помощью предложение внутри файла.

Смежные вопросы