Geht das? my @arr = ($text =~ m/regex/) || (0)
Christian
- perl
Hallihallo,
ich habe einen Text, aus dem ich eine Zahl herauslesen möchte. Das funktioniert mit
my ($zahl) = $text =~ /Total:(\d+)/;
einwandfrei.
Es kann aber auch vorkommen, dass 'Total:(\d+)' nicht im Text vorkommt, dann möchte ich die $zahl auf 0 setzen. Dafür hatte ich den Code erweitert zu
my ($zahl) = $text =~ /Total:(\d+)/ || (0);
was eigentlich auch funktioniert hat. Mittlerweile denke ich, dass ich mir das eingebildet haben muss, weil es so einfach nicht mehr tut. *verrücktwerd*
Bei diesem Konstrukt kommt _immer_ "$zahl = 1" heraus, wenn der Regex matcht. Nur wenn er nicht matcht, bringt er "$zahl = 0", so wie ich mir das vorstelle.
Würde mich freuen, wenn ihr mir meinen Denkfehler zeigen könntet :-)
Danke und Grüße
Christian
Hallo.
my ($zahl) = $text =~ /Total:(\d+)/ || (0);
Bei diesem Konstrukt kommt _immer_ "$zahl = 1" heraus, wenn der Regex matcht. Nur wenn er nicht matcht, bringt er "$zahl = 0", so wie ich mir das vorstelle.
Die Variable $zahl erhält nur die Werte 1 und 0, weil vor der Zuweisung der gesamte logische Ausdruck ausgewertet wird. Das was du geschrieben hast, ist das selbe wie das hier:
my $zahl = ($text =~ /Total:(\d+)/ || 0);
Alternativ könntest du statt des "||" einfach den Operator "or" verwenden, dessen Rang [1] ist nämlich niedriger als der einer Zuweisung:
my ($zahl) = ($text =~ /Total:(\d+)/) or (0);
Oder du machst es dir noch einfacher (und lesbarer):
my $zahl = $text =~ /Total:(\d+)/ ? $1 : 0;
Ich hoffe das hilft dir weiter. :-)
Schöne Grüße.
[1] http://de.selfhtml.org/perl/sprache/operatoren.htm#rangfolge
Hallo batooh
Oder du machst es dir noch einfacher (und lesbarer):
my $zahl = $text =~ /Total:(\d+)/ ? $1 : 0;
Diese Lösung gefällt mir sehr gut :-)
Trotzdem verstehe ich noch nicht ganz, warum meine erste Lösung nicht funktioniert. Z.B. funktioniert ja auch
sub bla {
my $text = shift || 'blabla';
...
}
Dort verwende ich den "||"-Operator genauso, aber es kommt immer der richtige Wert zurück und nicht nur 0 oder 1. Genauso wollte ich das machen, aber mit den Arrays tuts nicht.
Schöne Grüße
Christian
Moin!
Trotzdem verstehe ich noch nicht ganz, warum meine erste Lösung nicht funktioniert. Z.B. funktioniert ja auch
sub bla {
my $text = shift || 'blabla';
...
}
shift liefert ja auch stets dasselbe, nämlich einen scalar. m// lefert aber, je nach Kontext, einen scalar (1 oder undef) oder ein Array (die geklammerten Ausdrücke). Hier bindet das || so stark, daß sich der skalare Kontext auswirkt.
\-- Skeeve