如何匹配方括号而不用转义

0 perl

当我在perl中读取输入文件时,我得到了以下内容

u_pwrup_control/g_pwrup_bscan_cell[262]_u_pwrup_bscan
Run Code Online (Sandbox Code Playgroud)

现在我想使用regexp在参考文件中找到类似的行.但是当我使用下面的命令时,它不匹配.

while(<INPUT_FILE>){
    $k=$_;
    ##opening ref file in read mode
    while(<REF_FILE>)
        if ($_ =~ /$k/) {
            print $_;
        } else {
            print $k is not matching;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请告诉我如何匹配[]而不用逃避.

Dad*_*ada 5

您正在寻找这个功能quotemeta.或者,你可以\Q...\E在正则表达式中使用(有关它的更多信息perlre.
应用于你的代码:

  • 要么$k = quotemeta $_;($_虽然是可选的),而不是$k = $_;
  • 或保持$k = $_;和在正则表达式,做$_ =~ /\Q$k/.

你没有在你的问题中提供很多细节,所以我不能保证这实际上与你想要匹配的东西相匹配,但至少[](和任何其他不安全的角色)将在正则表达式中被转义.
特别是,您可能希望在阅读chomp这两while行之后,但这实际上取决于您正在阅读的内容.


但是您的代码可以通过多种方式得到改进,包括:

  • 始终添加use strict;use warnings;在脚本的开头.
  • 与前一点相关,但使用词法范围的变量(即用my而不是全局变量声明(未声明)).所以写my $k = ...而不是只$k = ...(只有当你声明它).
  • 而不是while像你那样做第一个:
    while (<INPUT_FILE>){ $k = $_; ... }
    做一些类似的东西要干得多:在很多情况下
    while (my $k = <INPUT_FILE>) { ... }
    使用$_很方便,但在那个,它实际上不是.
  • 不要使用全局文件句柄,而是使用词法变量:
    open my $INPUT_FILE, '<', 'your_file_name' or die $!
    并且,您可以像使用旧的全局变量一样使用它们:while (<$INPUT_FILE>) { ... }