in reply to While two conditions

It is hard to imagine what you are trying to achieve without a concrete example. Maybe generating an array of matches from your master string using your first match criteria, then filtering the array using your second match may do what you need. Otherwise I at least need to see a real sample string (keep it short please) and two example match criteria to be much more help.

True laziness is hard work

Replies are listed 'Best First'.
Re^2: While two conditions
by welle (Beadle) on May 01, 2012 at 08:56 UTC

    I am adapting Lingua::Concordance. It takes all occurences of $query and show it with its context in a ordered way.

    Here is the code

    $text="Oldfield's career began fairly early, playing <1> acoustic guit +ar in local folk clubs. At this time, he already had two fifteen-minu +te instrumental pieces in which he would "go through all <2>sorts of +moods", precursors to his landmark 1970s' compositions. In his early +teens, Oldfield was involved in a 'beat group' <3>playing Shadows-sty +le music (he has often cited Hank Marvin as a major influence, and wo +uld later cover The Shadows' song "Wonderful Land")." $query="in"; while ( $text =~ /$query/gi ) { my $match = $1; my $pos = pos( $text ); my $start = $pos - $self->radius - length( $match ); my $extract = ''; if ( $start < 0 ) { $extract = substr( $text, 0, $width + $start + length( $ma +tch )); $extract = ( " " x -$start ) . $extract; } else { $extract = substr( $text, $start, $width + length( $match +)); my $deficit = $width + length( $match ) - length( $extract + ); if ( $deficit > 0 ) { $extract .= ( " " x $deficit ) } } push @lines, $extract; }

    What I am trying to do is to read the <> tag and associate it to the corresponding $extract (for example: "guitar in local folk" seen after <1>)

      It's hard to tell exactly what you want to do, but a first guess is that my original suggestion was exactly on the money. Consider:

      use strict; use warnings; use Lingua::Concordance; my $text = <<TEXT; Oldfield's career began fairly early, playing <1> acoustic guitar in l +ocal folk clubs. At this time, he already had two fifteen-minute instrumental pi +eces in which he would "go through all <2>sorts of moods", precursors to his l +andmark 1970s' compositions. In his early teens, Oldfield was involved in a 'b +eat group' <3>playing Shadows-style music (he has often cited Hank Marvin as a ma +jor influence, and would later cover The Shadows' song "Wonderful Land"). TEXT my $query = 'in'; my $concordance = Lingua::Concordance->new (); $concordance->radius(25); $concordance->text($text); $concordance->query($query); my @matches = $concordance->lines(); my @pairs; for my $match (@matches) { while ($match =~ /<(\d+)>.*?$query/g) { push @pairs, map {[$_, $match]} $1 if $-[0] < $concordance->r +adius(); } } print "$_->[0]: $_->[1]\n" for @pairs;

      Prints:

      1: ng <1> acoustic guitar in local folk clubs. At thi 3: a 'beat group' <3>playing Shadows-style music (he
      True laziness is hard work

        Thank you.

        I see, I didn't explain my problem in a clear way. The problem of your code is that the tag must come inside the range of RADIUS (you set it at 25) to be detected. That is fine, but not the goal of my implementation. What I need is to print out the concordance PLUS the last tag seen before finding that concordance (i.e. before matching the $query).

        I'd like to put this information in a table "concordance of $query PLUS last tag seen before encountering $query".

        That is why I was trying to change the module's code.