Christian: Geht das? my @arr = ($text =~ m/regex/) || (0)

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

  1. 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

    1. 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

      1. 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