在perl中搜索两个匹配项

Posted

技术标签:

【中文标题】在perl中搜索两个匹配项【英文标题】:Searching for two matches in perl 【发布时间】:2013-12-21 05:52:21 【问题描述】:

我正在寻找一种方法来匹配单个字符串中的两个术语。例如,如果我需要同时匹配 "foo" 和 "bar" 以匹配和打印字符串,并且字符串是 "foo 121242Z AUTO 123456KT 8SM M10/M09 SLP02369",它将不匹配。但如果字符串是“foo 121242Z AUTO 123456KT 8SM bar M10/M09 SLP02369”,它将匹配然后继续打印。这是我目前拥有的代码,但我有点卡住了。谢谢!

use strict;
use warnings;
use File::Find;
use Cwd;

my @folder = ("/d2/aschwa/archive_project/METAR_data/");

open(OUT , '>', 'TEKGEZ_METARS.txt') or die "Could not open $!";

print OUT "Date (YYYYMMDD), Station, Day/Time, Obs Type, Wind/Gust (Kt), Vis (SM),
Sky, T/Td (C), Alt, Rmk\n";

print STDOUT "Finding METAR files\n";

my $criteria = sub if(-e && /^/)   
    open(my $file,$_) or die "Could not open $_ $!\n"; 
      my $dir = getcwd;
        my @dirs = split ('/', $dir);
         while(<$file>) 
           $_ =~ tr/\015//d;
             print OUT $dirs[-1], ' ', $_ if /foo?.*bar/;
                
              
            ;

find($criteria, @folder);
close OUT;
print STDOUT "Done Finding Station METARS\n"; 

【问题讨论】:

【参考方案1】:

为什么不简单:

perl -ne'print if /foo.*bar/'

如果您想处理某个目录中的更多文件,请使用find

find /d2/aschwa/archive_project/METAR_data/ -type f -exec perl -MFile::Spec -ne'BEGIN$dir = (File::Spec->splitdir($ARGV[0]))[-2] print $dir, ' ', $_ if /foo.*bar/'  \; > TEKGEZ_METARS.txt

【讨论】:

【参考方案2】:

您可以通过对两个字符串的积极前瞻来实现它:

print OUT $dirs[-1], ' ', $_ if m/(?=.*foo)(?=.*bar)/;

【讨论】:

【参考方案3】:
#!/usr/bin/perl
use warnings;
use strict; 

my $string1 = "foo 121242Z AUTO 123456KT 8SM M10/M09 SLP02369";
my $string2 = "foo 121242Z AUTO 123456KT 8SM bar M10/M09 SLP02369";  

my @array = split(/\s+/, $string2);

my $count = 0;
foreach (@array)
     $count++ if /foo/;
     $count++ if /bar/;



print join(" ", @array), "\n" if $count == 2;

这将为$string2 打印,但不会为$string1 打印

【讨论】:

以上是关于在perl中搜索两个匹配项的主要内容,如果未能解决你的问题,请参考以下文章

在两个容器 C++ 中搜索匹配项

如何编写从两个搜索值返回匹配项的 sql 查询

如何在 Perl 数组中搜索匹配的字符串?

在 Solr 中搜索日期范围或空/无字段 [重复]

Perl模式匹配大型连载1--初识正则

如何从用户文本输入中搜索数据库记录以查找匹配项并避免提取信息? (PHP)