-4

我有一个 Perl 脚本,可以在另一个字符串数组中搜索不同的子字符串(完全不相关的子字符串)。我现在已经使用循环和“if-else if-else if”测试实现了它。我在字符串数组中搜索单个子字符串并在第一个匹配时中断。我想知道是否可以通过避免循环来进一步优化它?是否有可能,例如在单个语句中搜索所有子字符串并获取字符串中可用的子字符串的索引。

例如,让子字符串数组命名为子字符串(@ 类型)并包含元素(abc,c10,9GH)。还有另一个数组字符串命名,例如'buffers'(类型@)。根据哪个子字符串匹配,我必须调用一些特定的函数。目前,我的伪代码是:

Loop through the buffers:
check:
if found abc -> call funABC()
else if found c10 -> call funC10()
else if found 9GH -> call fun9GH()

我完全想避免第二个 if-else if-else if 语句并进一步优化它。Perl 对此有任何支持吗?

4

2 回答 2

1
my %actions = (
    abc   => sub { do something },
    c10   => sub { do something },
    '9GH' => sub { do something }
);

my $re = join '|', map quotemeta, keys %action;
$re = qr/($re)/;

for my $buffer (@buffers) {
  $action{$1}->() if $buffer =~ m/$re/;
}

好消息,搜索是线性的,最多可达一万个子字符串,因为它被翻译成 trie (Aho-Corasick)。

于 2013-07-16T22:10:00.453 回答
0

有可能无法正确理解您的问题...

#!/usr/bin/perl

use strict;
use warnings;

# hardcode some strings and substrings
my @strs = ("abc,c10,9GH",
            "abc,c10",
            "c10,9GH",
            "abc,9GH",
            "abc",
            "c10",
            "9GH");
my @substrs = ("abc",
               "c10",
               "9GH");

# store booleans in an array for each string
my @matches = (); 
for (my $i = 0; $i < @strs; $i++) {
    my @match = (); 
    for (my $j = 0; $j < @substrs; $j++) {
        if ($strs[$i] =~ m/$substrs[$j]/) {
            push @match => 1;
        } else {
            push @match => 0;
        }   
    }   
    push @matches => @match;

现在您可以遍历@matches,它存储一个数组,指示每个缓冲区匹配的子字符串。

这是你想要的?

于 2013-07-16T21:41:07.323 回答