Как найти расположение индекса подстроки, сопоставленной с регулярным выражением в Perl? - PullRequest
4 голосов
/ 07 мая 2009

Я перебираю файл, и в каждой строке я ищу регулярное выражение. Если регулярное выражение найдено, я просто хочу напечатать «оно найдено», а затем указатель местоположения того места, где оно было найдено в этой строке.

Пример:

looking for: 'HDWFLSFKD' need index between two Ds
line: MLTSHQKKF*HDWFLSFKD*SNNYNSKQNHSIKDIFNRFNHYIYNDLGIRTIA
output: 'its found' index location: 10-17

Вышеупомянутое «поиск» довольно простое, но я планирую разместить там сложные операторы регулярных выражений.
Так что, в основном, просто хочу узнать, найдено ли регулярное выражение в строке, тогда как мы можем получить его индексное местоположение?

Вот код, который у меня есть:

foreach my $line (@file_data)
{
        if ($line=~ /HDWFLSFKD/){
            print "it's found\n"; 
            print "but at what index are the two Ds";
          }   
        else {
            $sequence.=$line;
            print "came in else\n";
        }
}

Ответы [ 2 ]

13 голосов
/ 07 мая 2009

Я полагаю, вы ищете pos:

 #!/usr/bin/perl

use strict;
use warnings;

my $sequence;
while (my $line = <DATA>) {
    if ($line=~ /(HDWFLSFKD)/g){
        print "its found index location: ", 
            pos($line)-length($1), "-",  pos($line), "\n";
    } else {
        $sequence .= $line;
        print "came in else\n";
    }
}

__DATA__
MLTSHQKKF*HDWFLSFKD*SNNYNSKQNHSIKDIFNRFNHYIYNDLGIRTIA
MLTSHQKKFSNNYNSKQNHSIKDIFNRFNHYIYNDLGIRTIA
MLTSHQKKFSNNYNSK*HDWFLSFKD*QNHSIKDIFNRFNHYIYNDLGIRTIA

Вы также можете использовать @- и @+ переменные:

#!/usr/bin/perl

use strict;
use warnings;

my $sequence;
while (my $line = <DATA>) {
        if ($line=~ /HDWFLSFKD/){
                print "its found index location: $-[0]-$+[0]\n";
        } else {
                $sequence .= $line;
                print "came in else\n";
        }
}

__DATA__
MLTSHQKKF*HDWFLSFKD*SNNYNSKQNHSIKDIFNRFNHYIYNDLGIRTIA
MLTSHQKKFSNNYNSKQNHSIKDIFNRFNHYIYNDLGIRTIA
MLTSHQKKFSNNYNSK*HDWFLSFKD*QNHSIKDIFNRFNHYIYNDL
0 голосов
/ 07 мая 2009

Вы можете разделить вашу строку с помощью регулярного выражения и вывести размер первого элемента массива, если в массиве более одного элемента. Простой образец:

my $test="123;456";
my @help=split(';', $test);
if ($#help>0) {
    print "Index is:".length($help[0]);
}

Редактировать: это соответствует вашему простому примеру, но не полностью вашему тексту - если регулярное выражение становится более сложным, тогда размер критериев разделения снова становится гибким Затем необходимо определить индекс второго элемента массива, чтобы определить размер критерия разделения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...