Найти номер строки, где подстрока найдена в большой строке в Perl - PullRequest
2 голосов
/ 07 февраля 2011

Каков наилучший способ поиска номера строки для подстроки в строке perl?Например: при поиске «escape» в

"How to Format
► put returns between paragraphs
► for linebreak add 2 spaces at end
► _italic_ or **bold**
► indent code by 4 spaces
► backtick escapes `like _so_`
► quote by placing > at start of line
► to make links
<http://foo.com>
[foo](http://foo.com)"

в качестве номера строки должен быть указан 6.

Ответы [ 6 ]

5 голосов
/ 07 февраля 2011

Мысль о другом решении.В достаточно свежих Perls вы можете открыть дескриптор файла для строки, а затем просто использовать специальную переменную $., чтобы автоматически отслеживать номер строки:

open my $handle, '<', \$str;
my $linenum;

while (<$handle>) {
    $linenum = $., last if /escape/;
}

close $handle;

if (defined $linenum) {
    print "Found match on line $linenum\n";
} else {
    print "No match found\n";
}
5 голосов
/ 07 февраля 2011

Вот как я бы это сделал:

my $string = 'How to Format
- put returns between paragraphs
- for linebreak add 2 spaces at end
- _italic_ or **bold**
- indent code by 4 spaces
- backtick escapes `like _so_`
- quote by placing > at start of line
- to make links
<http://foo.com>
[foo](http://foo.com)';

if ($string =~ /escape/) {
  # Count the number of newlines before the match.
  # Add 1 to make the first line 1 instead of 0.
  my $line = 1 + substr($string, 0, $-[0]) =~ tr/\n//;

  print "found at line $line\n";
}

Это позволяет избежать любых строк подсчета работы, если строка не найдена.Он использует @- переменную , чтобы узнать, где началось совпадение, а затем использует tr для подсчета новых строк.

3 голосов
/ 07 февраля 2011

$. Эта специальная переменная даст вам номер строки входного файла, для более подробной информации перейдите к http://perldoc.perl.org/perlvar.html

use strict;
use IO::Handle;
my $search = 'escapes';
while (my $line = <DATA>) {
       if ($line =~ /$search/){
            my $line_number = DATA->input_line_number();
        }
}

__DATA__
"How to Format
? put returns between paragraphs
? for linebreak add 2 spaces at end
? _italic_ or **bold**
? indent code by 4 spaces
? backtick escapes `like _so_`
? quote by placing > at start of line
? to make links
<http://foo.com>
[foo](http://foo.com)"
1 голос
/ 07 февраля 2011

Предполагается, что введенный вами текст содержится в одном скаляре:

my $i = 0;
my $lineno;
for my $line (split(/\n/, $large_block_of_text)) {
 if($line =~ /escape/) {
  $lineno = $i;
  last;
 }
 $i++;
}

if(defined($lineno)) {
 print("'escape' is on line $lineno\n");
} else {
 print("'escape' was not found\n");
}
0 голосов
/ 19 января 2013

Чтобы напечатать определенную строку из файла в интерфейсе Perl / CGI:

open(FILE,"<report_timing.log");
my @list = grep /\bslack\b/, <FILE>;
chomp @list;
print "$_\n<P>" foreach @list;
0 голосов
/ 07 февраля 2011

Я бы подошел к этой проблеме, итеративно ища в строке как целевой шаблон, так и символы новой строки:

my $str = "<your string above>";
my $linenum = 1;
my $found = 0;

while ($str =~ /(escape)|\n/g) {
    $found = 1, last if defined $1;
    ++$linenum;
}

pos($str) = 0;  # Reset last match position

if ($found) {
    print "Found match on line $linenum\n";
} else {
    print "No match found\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...