Portál AbcLinuxu, 26. dubna 2024 17:27
if ("te tea teta" =~ /(t|te).*/) { print $1; } else { print "NE"; }vrátí "t". Jaktože ale zde neplatí "hladové" pravidlo, kdy se Perl snaží vyhovět co nejširší odpovědi? Druhá otázka. Je někde stanoveno, jakým směrem má vybírat při postupu? Myslím tím, jestliže kdybych seřadil ten regulární výraz od nejdelšího k nejkratšímu (te|t), tak jestlipak budu mít zaručeno, že se dříve najde "te"? Snad jsem k pochopení
(v(y(ko)?)?)
, ale vnitřní skupiny by musely být nečíslované, aby se v tom vyznalo alespoň prase, což v perlu nevím z hlavy, ale je to v manu (proč sakra perl nemá v regulárních výrazech pojmenované skupiny jako python?).
$ echo "ahoj vole" | perl -e 'if (<> =~ /^(a|ah|aho|ahoj)/) {print "$1\n";}' a $ echo "ahoj vole" | grep -Eo '^(a|ah|aho|ahoj)' ahoj
[ivok@zero ivok]$ echo "ahoj vole" | grep -Po '(a|ah|aho|ahoj)' a
Alternatives are tried from left to right, so the first alternative found for which the entire expression matches, is the one that is cho- sen. This means that alternatives are not necessarily greedy. For exam- ple: when matching "foo|foot" against "barefoot", only the "foo" part will match, as that is the first alternative tried, and it successfully matches the target string. (This might not seem important, but it is important when you are capturing matched text using parentheses.)experimenátlní potvrzení
[ivok@zero ivok]$ perl -e 'print "$1\n" if ("te tea teta" =~ /(te|t)/)' te [ivok@zero ivok]$ perl -e 'print "$1\n" if ("te tea teta" =~ /(t|te)/)' ttakže: ano, není to greedy, a ano, máte zaručeno, že se matchuje v alternativách zleva doprava. aspoň v té verzi perlu, co tu mám já (5.8.5)
Tiskni Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.