Удалить элемент из результата массива соединения Perl - PullRequest
0 голосов
/ 10 сентября 2011

Моя проблема:

@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 голосов
/ 22 сентября 2011

Вы можете выполнить цикл по массиву, создав индекс, в котором вы видите первую и последнюю скобки, а затем извлеките соответствующий фрагмент.

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, но два отдельных цикла более эффективны. Это также зависит от структуры ваших данных; если его не много, эта оптимизация, очевидно, не очень важна. С другой стороны, если данных действительно много, вы можете оптимизировать их еще больше.

0 голосов
/ 10 сентября 2011

В вашем коде есть синтаксическая ошибка.

Сначала вы должны исправить это, а затем выяснить, как обрабатывать строку $.

Возможно, вы забыли сделать присвоение @array a qw?

Если это так, то приведенный ниже код будет вырезать текст до 1-го «окруженного текста» и текст после последнего «окруженного текста».

#!/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";
0 голосов
/ 10 сентября 2011

Попробуйте:

$line =~ s/\A[^(]+//;
$line =~ s/[^)]+\z//;
0 голосов
/ 10 сентября 2011

Посмотрите, работает ли это для вас:

$line =~ s/.*?(\(.*\)).*/$1/;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...