多行字符串上的Perl替换(REGEX)

时间:2014-08-07 11:13:46

标签: regex perl substitution

并为新问题道歉。我正在编写一个perl脚本,以便在运行之前检查MD5SUM。可以将其视为"不要更改脚本检查"。我设法获得FCIV二进制来计算MD5SUM,但是没有办法只获得MD5SUM作为单个字符串输出。

它向控制台吐出以下内容:

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

我想要删除这个多行字符串,只捕获md5sum。我假设最好的方法是使用替换正则表达式。不幸的是,但是我遇到了多行的字符串问题,它会占用整个事情。

1)除了正则表达式之外,还有更好的方法来处理此输出吗? 2)如果我们使用正则表达式,你会建议什么?

这就是我试图给我们的:

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

我对这一切都很陌生,任何评论都表示赞赏。提前谢谢。

3 个答案:

答案 0 :(得分:1)

一种可能的方法:拆分换行,走最后一行,取第二个字:

#!/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"

答案 1 :(得分:1)

简单直接的解决方案是使用Perl的标准库。特别是,Digest::MD5已经做了你想做的事。

use Digest::MD5 qw(md5_hex);
my $md5val = md5_hex($data);

答案 2 :(得分:1)

不使用替换来删除您不想要的所有内容,而是使用捕获组来提取您执行的部分:

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