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

时间:2016-10-15 12:48:28

标签: perl

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

u_pwrup_control/g_pwrup_bscan_cell[262]_u_pwrup_bscan

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

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

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

1 个答案:

答案 0 :(得分:5)

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

  • 要么$k = quotemeta $_;$_是可选的),而不是$k = $_;
  • 或保留$k = $_;并在正则表达式中执行$_ =~ /\Q$k/

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

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

  • 始终在脚本的开头添加use warnings;my $k = ...
  • 与前一点相关,但使用词法范围的变量(即用chomp声明而不是全局变量(未声明))。所以写$k = ...而不只是while(只有当你声明它时)。
  • 而不是那样做你的第一个while (<INPUT_FILE>){ $k = $_; ... }
    while (my $k = <INPUT_FILE>) { ... }
    做一些事情会更加清晰: $_
    在很多情况下使用open my $INPUT_FILE, '<', 'your_file_name' or die $!很方便,但在那一个中​​,它实际上并非如此。
  • 不要使用全局文件句柄,而是使用词法变量:
    while (<$INPUT_FILE>) { ... }
    而且,你可以像使用旧的全球版一样使用它们:<?php namespace AppBundle\Repository; //replace AppBundle by the name of your bundle use Doctrine\ORM\Tools\Pagination\Paginator; /** * PerformanceRepository * * This class was generated by the Doctrine ORM. Add your own custom * repository methods below. */ class PerformanceRepository extends \Doctrine\ORM\EntityRepository { public function getLastWeigth() { $qb = $this->getEntityManager()->createQueryBuilder() ->select('p') ->from($this->_entityName, 'p') ->expr()->isNotNull('p.weight') ->orderBy('p.date', 'desc') ->setMaxResults(1); $query = $qb->getQuery(); $result = $query->getSingleResult(); return $result; } }