【问题标题】:Perl Substitution (REGEX) on multi line string多行字符串上的 Perl 替换 (REGEX)
【发布时间】:2014-09-30 14:38:05
【问题描述】:

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

它会向控制台输出以下内容:

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

我想处理这个多行字符串,只捕获 md5sum。我假设最好的方法是使用替换正则表达式。不幸的是,但我遇到了字符串超过多行的问题,它清空了整个内容。

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

这就是我对我们的尝试:

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

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

【问题讨论】:

    标签: regex perl substitution


    【解决方案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"
    

    【讨论】:

    • 哇,太好了,谢谢!那是一个非常快速的答复。我稍微修改了一下,因为字符串没有在每行的开头使用#,否则它就像描述的那样工作。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回复。我会牢记这一点,以备将来发展。我没有使用这个库,因为我需要能够生成 MD5SUM 并将其硬编码到随后由脚本读取的配置文件中。这意味着捆绑 fciv。但是,一旦脚本完成,我可以替换它。
    【解决方案3】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2020-11-21
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      相关资源
      最近更新 更多