1

我正在尝试从文件中读取。这是我的文件的样子..

  abc123
      abdef012
    fedabc_23
        xyz12
  12345

现在,我要做的是,从命令行获取一个选项,并根据输入的通配符,如 *、?、+ 应该打印上面文件中的适当行。但我被困在这里。我知道。* 如何工作,但不确定其他通配符..请帮助我。

 #/perl/bin/perl
 use Getopt::Long;
 open (DATA, "filname.txt") || die "Can't open the file:$!";

 my $fil='';

 my $res= GetOptions (
"f=s" =>\$fil
);
$fil=~ s/[\*]//g;  #Works only if '*' is at the end

 /(\w*$fil\w*)/ && !$seen{$1}++ && push @arr, $1 while <DATA>;

如何也使用其他通配符?如何概括这一点?

4

2 回答 2

3

让我说清楚:

你有一个文件,你想输入一个正则表达式,并打印出所有匹配该表达式的行?像grep什么?

use strict;
use warnings;
use autodie;

my $regex = shift;
my $file  = shift;

open my $fh, "<", $file;  #Autodie will handle not being able to open files...
while ( my $line = <$fh> ) {
    print $line if $line =~ /$regex/;
}
close $fh;

或者,您是否尝试使用globbing而不是正则表达式?

有一个名为Text::Glob的 Perl 模块,它将匹配 glob 或将 glob 转换为正则表达式。

我从未使用过它,但它看起来很简单:

use strict;
use warnings;
use autodie;
use Text::Glob qw(match_glob);

my $glob = shift;
my $file  = shift;

open my $fh, "<", $file;  #Autodie will handle not being able to open files...
while ( my $line = <$fh> ) {
    print $line if match_glob( $glob, $line );
}
close $fh;
于 2013-07-19T13:59:22.610 回答
1

该符号*表示 0 个或多个前面的字符,因此d*x将匹配ddddddddxordxddx

符号+表示匹配1个或多个前面的字符,sotd+x也将匹配ddddddxdxddx

方括号定义了一个字符类,因此[\*]意味着匹配反斜杠或*符号。正则表达式中的许多特殊字符在方括号字符类中失去了意义。所以[\*]x会匹配\xor *x

?匹配前一个字符 0 次或 1 次的方法。所以d?x会匹配dxx

.匹配任何字符。

这些想法可以组合起来,以便匹配您可以使用的引号之间的任何字符,'.*'这将找到字符串中第一个引号和字符串中最后一个引号之间的所有字符(包括中间的任何引号)。或者仅匹配两个引号之间的文本,您可以通过在中包含 a来使*非贪婪。?'.*?'

您可以在http://www.regular-expressions.info/possessive.html阅读有关这些所有格量词如何工作的更多信息。

于 2013-07-19T12:30:24.427 回答