[geklärt] Wie matche ich nur auf eine einstellige Zahl ?

Begonnen von TomLee, 18 Dezember 2022, 19:01:57

Vorheriges Thema - Nächstes Thema

TomLee

Hi,

den Vergleich:
{ if ($wday == 1 || $wday == 4) { ... }
mehrmals zu wiederholen beschäftigt mich und hab überlegt wie wie man es anders/kürzer angehen kann.

Mit diesem match-Ansatz passt das zwar, bei dem Vergleich mit nur den Wochentagen:
{my $rd= 1;; return 'bla' if $rd =~ m/(1|4)/}

Mich würds aber interessieren wie der regexp aussehen müsste wenn Zahlen mit mehren Stellen vorkommen könnten.

Kann mir wer sagen wie und ob man das mit einem regulären Ausdruck machen könnte, das nur auf einstellige Werte gematched wird ?

Nobbynews

#1
Mit regexp stehe ich zwar wie viele auf dem Kriegsfuß, aber die Helligkeit zwischen 24 und 29 Lux habe ich in einem notify so gelöst:

ZWave_BWM_Garage_Lux:Helligkeit:.[2][4-9]$ {

Wie wäre es ungetestet mit xyz:.[2|4]$[/s]

Geht so nicht. Matched auch auf 244

TomLee

Mit eckigen hab ich zuvor schon probiert, wie mit vielen anderen Varianten

{my $rd= 11;; return 'bla' if $rd =~ m/[1|4]/}
bla


TomLee

Danke  :-*

So klappts:

{my $rd= 11;; return 'bla' if $rd =~ m/^[14]$/}

TomLee

Interresant wär jetzt noch welche Variante es noch gibt, wenn man das "smartmatch" vermeiden soll.

Nobbynews

Zitat von: TomLee am 18 Dezember 2022, 19:57:24
wenn man das "smartmatch" vermeiden soll.
Musste mich erst mal schlau machen, was damit gemeint ist.
Das, was ich gefunden habe, ist als smartmatch: ~~
Der Operator =~ ist ein Bindungsoperator und fällt doch nicht unter die Kategorie smartmatch.
Oder was war gemeint?

TomLee

Was ich im Kopf behalten hatte war das Jörg "=~" mal als "Smartmatch-Operator" bezeichnet hatte, keine Ahnung.

Aus der verlinkten Doku reim ich mir als Alternative das hier zusammen, hab mich nur kurz damit beschäftigt, schliesse nicht aus das ich was übersehen habe und es doch nicht passt:
{my @a=(1,4);; return 'bla' if grep { /^[14]$/} @a}