我的问题:
@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);
答案 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]);
这不像map
或grep
那么优雅,我担心。
编辑:最初只有一个循环来查找$first
和$last
,但两个单独的循环更有效。这还取决于数据的结构;如果没有很多,这种优化显然不是很重要。另一方面,如果确实存在大量数据,您可以进一步优化它。