Ricerca…


Stringhe corrispondenti

L'operatore =~ tenta di far corrispondere un'espressione regolare (separata da / ) a una stringa:

my $str = "hello world";
print "Hi, yourself!\n" if $str =~ /^hello/;

/^hello/ è l'espressione regolare attuale. Il ^ è un personaggio speciale che dice all'espressione regolare di iniziare con l'inizio della stringa e non corrispondere nel mezzo da qualche parte. Quindi la regex tenta di trovare le seguenti lettere in ordine h , e , l , l e o .

Le espressioni regolari tentano di far corrispondere la variabile predefinita ( $_ ) se nuda:

$_ = "hello world";

print "Ahoy!\n" if /^hello/;

È inoltre possibile utilizzare diversi delimitatori se si precede l'espressione regolare con l'operatore m :

m~^hello~;
m{^hello}; 
m|^hello|;

Questo è utile quando si confrontano stringhe che includono il carattere / :

print "user directory" if m|^/usr|;

Utilizzo di \ Q e \ E nella corrispondenza del modello

Quello che c'è tra \ Q e \ E viene trattato come caratteri normali

#!/usr/bin/perl

my $str = "hello.it's.me";

my @test = (
  "hello.it's.me",
    "hello/it's!me",
    );

sub ismatched($) { $_[0] ? "MATCHED!" : "DID NOT MATCH!" }

my @match = (
      [ general_match=> sub { ismatched /$str/ } ],
      [ qe_match    => sub { ismatched /\Q$str\E/ } ],
      );

for (@test) {
    print "\String = '$_':\n";

foreach my $method (@match) {
    my($name,$match) = @$method;
    print "  - $name: ", $match->(), "\n";
}

}

Produzione

String = 'hello.it's.me':
  - general_match: MATCHED!
  - qe_match: MATCHED!
String = 'hello/it's!me':
  - general_match: MATCHED!
  - qe_match: DID NOT MATCH!

Analisi di una stringa con un'espressione regolare

In genere, non è una buona idea usare un'espressione regolare per analizzare una struttura complessa . Ma può essere fatto. Ad esempio, potresti voler caricare i dati nella tabella hive e i campi sono separati da virgola, ma tipi complessi come la matrice sono separati da un "|". I file contengono record con tutti i campi separati da virgola e il tipo complesso è racchiuso tra parentesi quadre. In tal caso, questo bit di Perl usa e getta potrebbe essere sufficiente:

echo "1,2,[3,4,5],5,6,[7,8],[1,2,34],5" | \
    perl -ne \
        'while( /\[[^,\]]+\,.*\]/ ){
            if( /\[([^\]\|]+)\]/){
                $text = $1;
                $text_to_replace = $text;
                $text =~ s/\,/\|/g;
                s/$text_to_replace/$text/;
            }
        } print'

Ti consigliamo di verificare l'output:

1,2, [3 | 4 | 5], 5,6, [7 | 8], [1 | 2 | 34], 5

Sostituisci una stringa usando le espressioni regolari

s/foo/bar/;         # replace "foo" with "bar" in $_
my $foo = "foo";
$foo =~ s/foo/bar/; # do the above on a different variable using the binding operator =~
s~ foo ~ bar ~;     # using ~ as a delimiter
$foo = s/foo/bar/r; # non-destructive r flag: returns the replacement string without modifying the variable it's bound to
s/foo/bar/g;        # replace all instances


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow