Как я могу извлечь путь к файлу из строки Perl? - PullRequest
1 голос
/ 21 сентября 2010

Я хочу найти имя файла с полным путем из этой строки

"[exec] /snschome/sns/ccyp/mb_ccsns/bb/cbil5/v85_8/amdocs/iamcust/bil/cl/business/handlers/ClReportsHandler.java:233: cannot resolve symbol"

Я хочу извлечь

/snschome/sns/ccyp/mb_ccsns/bb/cbil5/v85_8/amdocs/iamcust/bil/cl/business/handlers/ClReportsHandler.java

, и я пытаюсь это сделать в Perl

    $_=$string_from_to_match
    my @extract_file=split(/.*(\/.*)\:.*/);
    print $extract_file[1],"\n";`

но я получаю этот вывод:

/ClReportsHandler.java:233:

Он соответствует последнему / и последнему :.Как я могу изменить его на первый / и первый :?

Ответы [ 4 ]

4 голосов
/ 21 сентября 2010

Это тот случай, когда «прихватывание и растяжение» полезно. Вы знаете, что [exec], за которым следует пробел слева, и двоеточие, за которым следует номер строки, справа. Вы хотите, что между:

#! /usr/bin/perl

use warnings;
use strict;

$_ = "[exec] /snschome/sns/ccyp/mb_ccsns/bb/cbil5/v85_8/amdocs/iamcust/bil/cl/business/handlers/ClReportsHandler.java:233: cannot resolve symbol";

if (/\[exec\]\s*(.+?):\d+/) {
  print $1, "\n";
}
1 голос
/ 21 сентября 2010

Вы можете попробовать:

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

my $str = "[exec] /snschome/sns/ccyp/mb_ccsns/bb/cbil5/v85_8/amdocs/iamcust/bil/cl/business/handlers/ClReportsHandler.java:233: cannot resolve symbol";
$str =~ s!^[^/]*(/[^:]*):.*$!$1!;
say $str;

Выход: /snschome/sns/ccyp/mb_ccsns/bb/cbil5/v85_8/amdocs/iamcust/bil/cl/business/handlers/ClReportsHandler.java

1 голос
/ 21 сентября 2010

Если имя вашего файла не содержит пробелов, вы можете создать простое регулярное выражение для соответствия всем частям:

my ($file, $line, $msg) = ( $string_from_to_match =~ m{(\S+):([^:]+):([^:]+)} );

Я использовал:

  • \S+ длясоответствовать 1 или более непробельным символам
  • [^:]+, чтобы соответствовать 1 или более не : символов

Если вы хотите пробелы в пути, тогда лучший способ удалитьначиная [exec] часть и делится на ::

$string_from_to_match =~ s{^\[exec\]\s+}{};
my ($file, $line, $msg) = split(/:/, $string_from_to_match, 3);
0 голосов
/ 21 сентября 2010

Почему вы используете split(), если хотите соответствовать?

if ($subject =~ m!(/[^:]+):!) {
    $result = $1;
} else {
    $result = "";
}

должно это сделать.

Объяснение:

!: альтернативный разделитель регулярных выражений(так как мне нужен / внутри)

(: начать захват группы

/: соответствовать /.Это всегда будет первый / строки.

[^:]+: соответствует 1 или более символам, за исключением :

): группа захвата конца

:: соответствует :

!: разделитель регулярных выражений

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