2 votes

Extraire le mot avant la 1ère occurrence d'une chaîne spéciale

J'ai un tableau qui contient des éléments tels que

@array=("link_dm &&& drv_ena&&&1",
        "txp_n_los|rx_n_lost",
        "eof &&& 2 &&& length =!!!drv!!!0");

Je veux obtenir tous les caractères avant le premier "&&&", et si l'élément n'a pas de "&&&", alors je dois extraire l'élément entier.

Voici ce que je veux extraire:

link_dm
txp_n_los|rx_n_lost
eof

J'ai utilisé

    foreach my $row (@array){
      if($row =~ /^(.*)\&{3}/){
        push @firstelements,$1;
      }
    }

Mais j'obtiens

link_dm &&& drv_ena
txp_n_los|rx_n_lost
eof &&& 2

Quelqu'un peut-il suggérer comment je peux y parvenir?

3voto

Kenosis Points 6136

Peut-être que juste split serait utile :

use strict;
use warnings;

my @array = (
    "link_dm &&& drv_ena&&&1",
    "txp_n_los|rx_n_lost",
    "eof &&& 2 &&& length =!!!drv!!!0"
);

foreach my $row (@array){
    my ($chars) = split /\&{3}/, $row, 2;
    print $chars, "\n"
}

Sortie :

link_dm 
txp_n_los|rx_n_lost
eof

0voto

ruakh Points 68789

Vous pouvez écrire :

@firstelements = map { m/^(.*?) *&&&/ ? $1 : $_ } @array;

Ou, si vous préférez foreach à la place de map et if à la place de ?::

foreach my $row (@array){
  if($row =~ /^(.*)\&{3}/) {
    push @firstelements, $1;
  } else {
    push @firstelements, $row;
  }
}

0voto

perreal Points 47912
pour (@tableau) {
    print "$1\n" if /([^ ]*)(?: *[&]{3}.*)?$/;
}

0voto

shawnhcorey Points 1660

Si vous utilisez des expressions régulières, utilisez le modèle d'espacement minimum: .*?. Voir perldoc perlre http://perldoc.perl.org/perlre.html

#!/usr/bin/env perl

use strict;
use warnings;

# --------------------------------------

use charnames qw( :full :short   );
use English   qw( -no_match_vars );  # Évite les pénalités de performances des regex

use Data::Dumper;

# Rendre Data::Dumper joli
$Data::Dumper::Sortkeys = 1;
$Data::Dumper::Indent   = 1;

# Définir la profondeur maximale pour Data::Dumper, zéro signifie illimité
local $Data::Dumper::Maxdepth = 0;

# Déclarations de DEBUG conditionnelles
# Voir http://lookatperl.blogspot.ca/2013/07/a-look-at-conditional-compiling-of.html
use constant DEBUG => $ENV{DEBUG};

# --------------------------------------

my @array = (
    "link_dm &&& drv_ena&&&1",
    "txp_n_los|rx_n_lost",
    "eof &&& 2 &&& length =!!!drv!!!0",
);

my @first_elements = ();
for my $line ( @array ){

  # Vérifier pour '&&&'
  if( my ( $first_element ) = $line =~ m{ \A (.*?) \s* \&{3} }msx ){
    push @first_elements, $first_element;
  }else{
    push @first_elements, $line;
  }
}
print Dumper \@first_elements;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X