perl在文本文件中获取匹配的模式

siv3szwd  于 2023-02-23  发布在  Perl
关注(0)|答案(1)|浏览(154)

我想从一个文件中得到-cfg的值。需要正则表达式的帮助。
文件包含:

### Full Command: /some/path/ -cfg abc123/123def ###

预期产出:abc123/123def
代码:

use strict;
use warnings;
my $file="file.txt"
open(F, '<', $file) or die "cannot open $file";

while (<F>) {
   chomp;
   if (/-cfg\s([a-zA-Z0-9_.]*)\s/) {
     $value=$1;
               print "Config: $value";
   }
}
close F;
nhaq1z21

nhaq1z211#

正则表达式模式缺少/,该字符串位于要匹配的字符串(abc123/123def)中。由于模式分隔符为/,因此在模式内必须转义/

/-cfg\s([a-zA-Z0-9_.\/]*)\s/

或者,您可以将分隔符更改为几乎任何内容,然后我们确实需要前面的m

m{-cfg\s([a-zA-Z0-9_./]*)\s}

如果您只需要ASCII码,可以使用\w作为“单词字符”([a-zA-Z0-9_])†,这样可以简化

m{-cfg\s([\w./]*)\s}

它还可以让您更容易地看到我们匹配的内容(单词字符和.以及/)。
我想补充的是,/x修饰符通常是一个真实的的祝福,使它忽略空格(和换行符和#-注解),以便模式可以展开以提高可读性

m{ -cfg \s ([\w./]*) \s }x

参考:教程perlretut和完整的参考perlreperlrebackslash通常很方便。
对问题中程序的评论

  • 程序不会运行,因为$value是未声明的,对于什么strict pragma将停止它在编译.需要
my $value = $1;
  • 最好使用词法文件句柄open my $fh, '<', $file ...。参见perlopentut和参考open。(另外,从v5.36.0开始,“bareword文件句柄”在默认情况下不起作用。)
  • 总是打印实际的错误,大多数时候使用$! error变量。
open my $fh, '<', $file or die "Can't open $file: $!";

†任何字母数字字符(和_),100_000+ Unicode字符

相关问题