我正在尝试编写一个接受字符串输入和文件输入的脚本。
字符串输入如下:
input_range*_blah
该文件将包含类似
的行*_blah
input*_*ah
blah1
blah2
blah3
我希望脚本在此特定示例中为第一行和第二行生成匹配。
我无法弄清楚这个的语法,请有人帮帮我吗? 提前谢谢!
答案 0 :(得分:1)
如果我正确理解了问题,那么您的文件包含一个模式列表,并且您希望打印出与输入字符串匹配的每个模式。因此,您可以打印*_blah
和input*_*ah
,因为这两种模式都匹配input_range*_blah
,但不匹配blah1
或以下模式,因为它们与输入字符串不匹配。< / p>
在这种情况下,我认为您不需要对星号进行任何特殊处理。在目标字符串中,星号只是另一个字符 - 它不会被解释为任何特殊方式。这段代码应该这样做:
#! /usr/bin/perl
use warnings;
use strict;
use Text::Glob qw/match_glob/;
my $input_string = $ARGV[0];
shift;
while (defined (my $pattern = <>)) {
chomp $pattern;
print $pattern, "\n" if (match_glob($pattern, $input_string));
}
演示:使用包含示例字符串的文件glob.dat
:
$ perl glob.pl 'input_range*_blah' glob.dat
*_blah
input*_*ah
答案 1 :(得分:0)
您需要在匹配中转义*
个字符。尝试使用此正则表达式:
use warnings;
use strict;
open my $input, '<', 'in.txt' or die "$!";
my $match = '(.*\*.*)';
while (<$input>){
chomp;
print "$_\n" if /$match/;
}
这将声明一个变量作为文字*
之前或之后的任何内容的匹配项,并逐行读取输入文件,打印出与其匹配的行