【问题标题】:Searching multiple strings [closed]搜索多个字符串[关闭]
【发布时间】:2014-06-23 10:52:37
【问题描述】:

我如何从一组字符串中搜索

我想要一个 perl 脚本来搜索 "aaa", "bbb", "ccc", "ddd"

从 txt 文件中搜索

示例 1

some random text
blah
blah 
blah
//Car/trunk/sandbox/users/Tom/xyz/bbb/toyota

期望的输出:

//Car/trunk/sandbox/users/Tom/xyz/...

示例 2

some random text
blah
blah 
blah
//Car/trunk/sandbox/users/Alex/abc/defg/ddd/honda/accord

期望的输出:

//Car/trunk/sandbox/users/Alex/abc/defg/...

基本上从"aaa", "bbb", "ccc", "ddd" 中的给定字符串集搜索它会在示例1 中找到"bbb" 并获取之前的所有内容并使用"..." 添加反斜杠

请注意,它是从一个文本文件中读取的,示例 1 是文本文件的示例,示例 2 也是如此。

到目前为止,这就是我所拥有的。

my $infile = 'new5.txt';
    my @strings  = qw/aaa bbb ccc ddd/;
    local @ARGV = ($infile);
    while( <> ){

        print;
    }

【问题讨论】:

  • 您要匹配的字符串是否必须在斜杠内,例如../aaa/.. 应该匹配但不匹配 ../aaardvark/..?
  • Perl 有很棒的文档。从这里开始:perldoc.perl.org/perlre.html
  • 必须在斜线内 ../aaa/..,抱歉忘了提。

标签: string perl search replace


【解决方案1】:

到目前为止,您所拥有的代码就是我所说的对文件进行分类的骇人听闻的方式。 首先,我们将排除强制性的编译指示:

use strict;
use warnings;
use autodie;

最后一个确保脚本在找不到文件或无法打开时终止。 你正确初始化了 $infile 和 @strings,很好。

打开和循环文件内容的正确或更可接受的方式是:

open(my $FILE, "<", $infile);
while(my $line = <$FILE>) {
   chomp $line;
   ...
}
close($FILE);

在这个循环中,您想尝试匹配@strings 数组的每个元素。这可以通过遍历数组中的每个元素来完成:

foreach my $elem (@strings) {
    ...
}

在这个循环中你想要进行匹配。如果是这样,请打印出您需要的内容(并转到文件中的下一行)。查看perlre 手册页,了解=~ 之后的内容在做什么:

if ($line =~ m#/$elem/#) {
    print SOMETHING;
    next;
}

那会是什么?根据perlvar 手册页,`$`(以及其他助记符)是包含匹配字符串之前的字符串的变量:

print $`."/...\n";

把它们放在一起,你就有了你的脚本。

【讨论】:

  • 好人,感谢您的帮助!有效。很好的解释:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多