Domanda

Ho una stringa da cui desidero estrarre una singola parola, ma con un numero numerico ad essa aggiunto, che potrebbe essere diverso in ogni riga:

This is string1 this is string
This is string11 
This is string6 and it is in this line

Voglio analizzare questo file e ottenere i valori di " stringXXX " ;, a partire da 0 a 100

# suppose ABC.txt contains the above lines
FH1 = open "Abc.txt"; 
@abcFile = <FH1>;

foreach $line(@abcFile) {
    if ($pattern =~ s/string.(d{0}d{100});
        print $pattern;

Quanto sopra stampa l'intera riga, desidero ottenere solo stringXXX

È stato utile?

Soluzione

devi catturarlo:

while ($pattern =~/(string(100|\d{1,2}))/g) {
    print $1;
}

Spiegazione:

  • le parentesi catturano ciò che è contenuto in $ 1. Se hai più di un set di parentesi, la prima cattura in $ 1, la seconda in $ 2 ecc. In questo caso $ 2 avrà il numero effettivo.
  • \ d {1,2} cattura tra 1 e 3 cifre, permettendoti di catturare tra 0 e 99. I 100 aggiuntivi lì ti permettono di catturare esplicitamente 100, poiché è l'unico numero di 3 cifre che vuoi abbinare.

modifica: risolto l'ordine dei numeri catturati.

Altri suggerimenti

Abc.pl:

#!/usr/bin/perl -w    
while(<>) {
    while (/(string(\d{1,3}))/g) {      
    print "$1\n" if $2 <= 100;
    } 
}

Esempio:

$ cat Abc.txt 
This is string1 this is string
This is string11 
This is string6 and it is in this line
string1 asdfa string2
string101 string3 string100 string1000
string9999 string001 string0001

$ perl Abc.pl Abc.txt
string1
string11
string6
string1
string2
string3
string100
string100
string001
string000

$ perl -nE"say $1 while /(string(?:100|\d{1,2}(?!\d)))/g" Abc.txt
string1
string11
string6
string1
string2
string3
string100
string100

Notare la differenza tra le uscite. Ciò che è preferibile dipende dalle tue esigenze.

Non specificare in modo eccessivo. Per acquisire la parte numerica, basta usare (\ d +). Questo catturerà un numero di qualsiasi lunghezza, in modo che un giorno quando le scimmie che ti stanno fornendo questo file decidono di espandere il loro raggio fino a 999, sarai coperto. È anche meno pensato, sia ora che stai scrivendo, sia più tardi quando lo stai mantenendo.

Sii rigoroso in ciò che emetti, ma sii liberale in ciò che accetti.

Cambia semplicemente $ print pattern per stampare $ & amp ;, che è già stato catturato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top