从perl连接数组结果中删除元素

时间:2011-09-10 12:19:59

标签: regex perl

我的问题:

@array = (possible text,
          text surrounded with round brackets,
          text without brackets,
          text surrounded with round brackets,
          possible text);

$line = join(' ', @array);

我想删除,如果第一个括号前面有任何文本,连接结果的最后一个括号后面的任何文本(可能是文本)。 感谢。

真实代码:

my (@lines, $line, $anchor, $left, $right, $parent, $elem);
($anchor) = $tree->look_down(_tag=>"span", class=>"txt");
if ($anchor) {
    $elem = $anchor; 
    my ($product, @tmp);
    while (($elem = $elem->right()) &&
            ((ref $elem) && ($elem->tag() ne "table"))) {
        @tmp = get_all_text($elem);
        push @lines, @tmp;
        $line = join(' ', @tmp);

4 个答案:

答案 0 :(得分:0)

看看这是否适合你:

$line =~ s/.*?(\(.*\)).*/$1/;

答案 1 :(得分:0)

您的代码有语法错误。

你应该先修复它,然后弄清楚如何进一步处理$ line。

也许你忘了把@array的任务分配给qw?

如果是这样,那么下面的代码将删除第一个“文本包围”之前的文本 以及最后一个“文字包围”之后的文字。

#!/usr/bin/perl
#use warnings;
#use strict;

@array = qw(possible text,
          text surrounded with round brackets,
          text without brackets,
          text surrounded with round brackets,
          possible text);

$line = join(' ', @array);

$line =~ s/.*?(text surrounded with round brackets)/$1/;
$line =~ s/(.*text surrounded with round brackets).*/$1/;
print "$line\n";

答案 2 :(得分:0)

尝试:

$line =~ s/\A[^(]+//;
$line =~ s/[^)]+\z//;

答案 3 :(得分:0)

你可以遍历数组,建立一个索引,看你在哪里看到第一个括号和最后一个括号,然后提取相应的切片。

my @array = ('possible text',
   '(text surrounded with round brackets)',
   'text without brackets',
   '(text surrounded with round brackets)',
   'possible text');

my ($first, $last);
for (my $i = 0; $i < $#array; ++$i) {
    next unless $array[$i] =~ m/^\s*\(/;  # maybe adapt this regex
    $first = $i;
    last;
}
for (my $j = $#array; $j > 0; --$j) {
    next unless $array[$i] =~ m/^\s*\(/;  # tweak this too then
    $last = $j;
    last;
}

my $line = join (' ', @array[$first..$last]);

这不像mapgrep那么优雅,我担心。

编辑:最初只有一个循环来查找$first$last,但两个单独的循环更有效。这还取决于数据的结构;如果没有很多,这种优化显然不是很重要。另一方面,如果确实存在大量数据,您可以进一步优化它。