2015-08-31 1 views
0

Я хочу удалить слова Z или ZN и LVT из строк, присутствующих в моем файле, но я не смог его получить. Может кто-то проверить мой код.Удалить соответствующие слова из строки с помощью Perl

Входной

abchsfk/jshflka/ZN      (cellLVT) 
asjkfsa/sfklfkshfsf/Z     (mobLVT) 
asjhfdjkfd/sjfdskjfhdk/hsakfshf/Z  (celLVT) 
asjhdjs/jhskjds/ZN      (abcLVT) 
shdsjk/jhskd/ZN       (xyzLVT) 

Выход

abchsfk/jshflka      cell 
asjkfsa/sfklfkshfsf     mob 
asjhfdjkfd/sjfdskjfhdk/hsakfshf  cel 
asjhdjs/jhskjds      abc 
shdsjk/jhskd      xyz 

КОД:

 if ($line =~ /LVT/ && ($line =~ /ZN/ || $line =~ /Z/))   

     #### matches the words LVT and (Z or ZN) 

     { 
      my @names = split//, $line;  ##### splits the line 


       $names[2] =~ s/\/Z|/ZN//g;  #### remove Z or ZN 
       $names[3] =~ s/\(|LVT\)//g ; #### remove LVT & braces 

       print OUT " $names[2] $names[3] \n"; #### print 

     } 
+1

Почему не просто '$ строки = ~ с/\/ZN | LVT // г;' – sln

+0

@sln?. Спасибо. Я хочу удалить «/ Z» и «/ ZN» вместе вместо Z или ZN. и я хочу также удалить фигурные скобки. Поэтому я попытался сначала разбить его, а затем попытаться удалить его один за другим. – SKG

+0

@sln. Я пробовал этот путь из идеи, которую вы дали. это сработало для меня. '$ line = ~ s/\/ZN? | \ (| LVT \) // g;' – SKG

ответ

2

Проблема заключается в порядок согласования: (! Второй обратный слэш отсутствует в вашем коде) s/\/Z|\/ZN//g. Сначала нужно совместить более длинную строку, иначе Z будет соответствовать, и N не будет удалена.

Там даже более простой способ, хотя: Просто используйте \/ZN?:

#!/usr/bin/perl 
use warnings; 
use strict; 

while (my $line = <DATA>) { 
    if ($line =~ /LVT/ && $line =~ /ZN?/) { 

     my @names = split ' ', $line; 
     $names[0] =~ s/\/ZN?//g; 
     $names[1] =~ s/\(|LVT\)//g; 
     print "$names[0] $names[1]\n"; 
    } 
} 
__DATA__ 
abchsfk/jshflka/ZN      (cellLVT) 
asjkfsa/sfklfkshfsf/Z     (mobLVT) 
asjhfdjkfd/sjfdskjfhdk/hsakfshf/Z  (celLVT) 
asjhdjs/jhskjds/ZN      (abcLVT) 
shdsjk/jhskd/ZN       (xyzLVT) 
+0

Благодарим вас за объяснение. его действительно полезно – SKG

+0

У меня есть еще один вопрос, чтобы спросить в этом. В моем выпуске. Некоторые из строк повторяются. Я хочу отсортировать их и распечатать их только один раз. Могу ли я использовать функцию сортировки. Вот что я пытаюсь 'в то время как (мой $ строка = ) { если ($ строка = ~/LVT/&& $ строки = ~/ZN? /) {' мои @names = раскол '', $ линии; $ names [0] = ~ s/\/ZN? // g; $ names [1] = ~ s/\ (| LVT \) // g; my @line_out = "$ names [0] $ names [1]"; $ lvt_out = sort :: $ line_out(); print "$ lvt_out \ n"; } ' – SKG

+2

@SKG: Вы должны задать новый вопрос в новом вопросе. – choroba

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