Подстановка Perl (REGEX) в многострочной строке

и извинения за вопрос newb. Я пишу perl-скрипт, чтобы проверить MD5SUM на себя перед запуском. Думайте об этом как о «не меняйте проверку скрипта». Мне удалось получить двоичный файл FCIV для вычисления MD5SUM, но нет способа получить только MD5SUM в виде однострокового вывода.

На консоль выводится следующее:

    # //
    # // File Checksum Integrity Verifier version 2.05.
    # //
    # 3e593beb3bb51a23f5a2ccae0f2c70a3 perlscript.pl

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

1) Есть ли лучший способ обработать этот вывод, кроме регулярного выражения? 2) Если мы используем регулярное выражение, что бы вы посоветовали?

Вот что я пытаюсь нам сделать:

    $md5val =~s /(\/\/[.])*\n//;

Я новичок во всем этом, любые комментарии приветствую. Заранее спасибо.


person user3691037    schedule 07.08.2014    source источник


Ответы (3)


Один из возможных способов: разделить на новые строки, взять последнюю строку, взять второе слово:

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

my $md5val = '    # //
    # // File Checksum Integrity Verifier version 2.05.
    # //
    # 3e593beb3bb51a23f5a2ccae0f2c70a3 perlscript.pl
';

$md5val = (split ' ', (split /\n/, $md5val)[-1])[1];
print "<$md5val>\n"
person choroba    schedule 07.08.2014
comment
Вау, отлично, спасибо! Это был очень быстрый ответ. Я немного изменил его, потому что строка не использовала # в начале каждой строки, в противном случае она работает так, как описано. - person user3691037; 07.08.2014

Простое и понятное решение - использовать стандартную библиотеку Perl. В частности, Digest :: MD5 уже делает то, что вы хотите.

use Digest::MD5 qw(md5_hex);
my $md5val = md5_hex($data);
person tripleee    schedule 07.08.2014
comment
Спасибо за ответ. Я буду иметь это в виду для дальнейшего развития. Я не использовал эту библиотеку, потому что мне нужно иметь возможность сгенерировать MD5SUM и жестко закодировать его в файл конфигурации, который впоследствии будет прочитан сценарием. Это означает сборку fciv. Однако, как только сценарий будет завершен, я смогу заменить его. - person user3691037; 07.08.2014

Вместо использования подстановки для удаления всего, что вам не нужно, используйте группу захвата для извлечения той части, которую вы делаете:

use warnings;
use strict;

my $md5val = do {local $/; <DATA>};

my ($md5sum) = $md5val =~ /\b([0-9a-f]{32})\b/;

print "$md5sum\n";

__DATA__
    # //
    # // File Checksum Integrity Verifier version 2.05.
    # //
    # 3e593beb3bb51a23f5a2ccae0f2c70a3 perlscript.pl

Выходы:

3e593beb3bb51a23f5a2ccae0f2c70a3
person RobEarl    schedule 07.08.2014