Perl: Kann abgefragt werden, wie oft ein RE matched?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Perl: Kann abgefragt werden, wie oft ein RE matched?

Beitrag von inne » 05.05.2021 14:44:28

Hallo,

wenn ich

Code: Alles auswählen

perl -E '"axcxe" =~ /a|b|c|d|e/'
habe, kann ich dann abfragen, dass 3mal ein Match da ist?

Ich denke zwar das geht nicht, aber ein

Code: Alles auswählen

echo axcxe | grep --color -P 'a|b|c|d|e'
hebt das auch hervor :axcxe

Es geht mir um Perl (auch die Abfrage in Perl) nicht Shell!

Ich will damit priorisieren können, welcher String /gewichtiger/ ist.

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Perl: Kann abgefragt werden, wie oft ein RE matched?

Beitrag von tobo » 05.05.2021 15:21:18

Sowas?

Code: Alles auswählen

perl -E '$m = () = "axcxe" =~ m/a|b|c|d|e/g; print "$m"'

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Perl: Kann abgefragt werden, wie oft ein RE matched?

Beitrag von inne » 05.05.2021 15:45:43

Ja ich denke! Super Danke.

Kannst Du mir bitte noch erkläre was das = () = macht? Ich erkenne darin gerade nur eine (leere) Liste? Steht das in perlre(1)?

Code: Alles auswählen

use Data::Dumper;
print Dumper ("axcxe" =~ m/a|b|c|d|e/g);

print "#\n";

$m = () = "axcxe" =~ m/a|b|c|d|e/g;
print Dumper ( $m );
Ausgabe:

Code: Alles auswählen

$VAR1 = 'a';
$VAR2 = 'c';
$VAR3 = 'e';
#
$VAR1 = 3;

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Perl: Kann abgefragt werden, wie oft ein RE matched?

Beitrag von tobo » 05.05.2021 17:13:37

Die () betrachten die RegEx im Listen-Kontext, das Endergebnis dann wird als Skalar benötigt. Also nichts anderes als ein Kontextwechsel. Man kann das auch vielleicht schöner schreiben:

Code: Alles auswählen

$ perl -E '@m = "axcxe" =~ m/a|b|c|d|e/g; print "@m - ", scalar @m'
a c e - 3

Antworten