Wolfgang: $_ in Schleifen

Bakanntlich kann man $_ als Schleifenvariable verwenden, z.B.

foreach(@Zahlen) {
 print $_, "\n";
}

Gibt es eine ähnliche Nöglichkeit, wenn man in der Schleife eine weitere Schleife hat?

foreach(@Zahlen) {
 print $_, "\n";
 foreach (@namen) {
  print ?????, "\n";
 }
}

Schönen Tag

  1. Hallo Wolfgang,

    Gibt es eine ähnliche Nöglichkeit, wenn man in der Schleife eine weitere Schleife hat?

    foreach(@Zahlen) {
    print $_, "\n";
    foreach (@namen) {
      print ?????, "\n";
    }
    }

    die Lösung steht in SELFHTML und lautet:

    foreach(@zahlen) {
        print "$_\n";
        foreach $unter (@name) {
            print "$_: $unter\n";
        }
    }

    mit use strict dann "foreach my $unter (@name)" - sieht in der Tat ein bisschen verrückt aus.

    Grüße,

    Sven

    1. Hallo Sven,
      danke für die Hilfe.

      foreach(@zahlen) {
          print "$_\n";
          foreach $unter (@name) {
              print "$_: $unter\n";
          }
      }

      Ich nehme an, $unter ist eine beliebig zu wählende Variable
      und die Kurzform mit einem reserviertem Wort geht damit nur einmal innerhalb einer verschachtelten Schleife.
      Ich hatte gehofft, es gäbe etwas in der Art
      1. Schleife $_
      2. Schleife $1_
      usw.

      1. Hallo Wolfgang,

        Ich nehme an, $unter ist eine beliebig zu wählende Variable

        jepp

        und die Kurzform mit einem reserviertem Wort geht damit nur einmal innerhalb einer verschachtelten Schleife.

        selbstverständlich

        Ich hatte gehofft, es gäbe etwas in der Art

        1. Schleife $_
        2. Schleife $1_

        Variablennamen können wie in den meisten anderen Programmiersprachen nicht mit einer Zahl beginnen.

        Siehe auch SELFHTML:

        http://de.selfhtml.org/perl/sprache/schleifen.htm#foreach

        Grüße,

        sven

        1. Hallo

          Schon mal probiert was folgendes machen würde?

          @testlist = ("Test1","Test2","Test3");  
          @zahllist = (1,2,3);  
            
          foreach(@zahllist) {  
            print "$_ ";  
            foreach(@testlist) {  
              print "$_ ";  
            }  
            print "\n";  
          }
          

          Geht natürlich auch, weil in $_ immer das enthält was gerade aus der Liste gelesen wurde. Also ist dann die Ausgabe.

          1 Test1 Test2 Test3
          2 Test1 Test2 Test3
          3 Test1 Test2 Test3

          1. Moin,

            Geht natürlich auch, weil in $_ immer das enthält was gerade aus der Liste gelesen wurde. Also ist dann die Ausgabe.

            begründet dadurch, dass $_ in jeder Schleife lokal neu definiert wurde. Das ist genau das gleiche wie z.B.

              
            my $bla = "hallo";  
            echo $bla;  
              
            if($bla) {  
                my $bla = " dallo ";  
                echo $bla;  
            }  
              
            echo $bla;  
            
            

            um mal was ganz triviales zu nehmen. Das $bla im Container ist folglich nicht das gleiche $bla wie draußen und ausgegeben wird "hallo dallo hallo", nicht etwa "hallo dallo dallo". *SCNR*

            ;-)

            Grüße,

            Sven

        2. gudn tach!

          Variablennamen können wie in den meisten anderen Programmiersprachen nicht mit einer Zahl beginnen.

          perl -e "$_='ach ja?';print 'do'.$1.'!' if /(?:a)(..)/;"

          prost
          seth

          1. Hallo seth,

            Variablennamen können wie in den meisten anderen Programmiersprachen nicht mit einer Zahl beginnen.
            perl -e "$_='ach ja?';print 'do'.$1.'!' if /(?:a)(..)/;"

            $1 bis $10 sind reservierte Namen für Regex-Matchings. Siehe SELFHTML, Perl-Sektion. $4hallo oder $2007ist_einNeuesjahr sind keine gültigen Variablennamen in Perl.

            Grüße,

            Sven

            1. gudn tach!

              Variablennamen können wie in den meisten anderen Programmiersprachen nicht mit einer Zahl beginnen.
              perl -e "$_='ach ja?';print 'do'.$1.'!' if /(?:a)(..)/;"

              $1 bis $10 sind reservierte Namen für Regex-Matchings.

              und um solche ging es. (dass man $_ auch writable ist, ist hierbei zweitrangig)

              prost
              seth

              1. gudn tach!

                Variablennamen können wie in den meisten anderen Programmiersprachen nicht mit einer Zahl beginnen.
                perl -e "$_='ach ja?';print 'do'.$1.'!' if /(?:a)(..)/;"

                $1 bis $10 sind reservierte Namen für Regex-Matchings.

                und um solche ging es. (dass man $_ auch writable ist, ist hierbei zweitrangig)

                als ergaenzung: auch das handbuch (perldoc perlre) bezeichnet $1, $2, ... als variablen.

                prost
                seth

  2. Am besten wäre wohl, Du vergisst den Unterstrich und schreibst immer sinngemaess:

    my $zeile_brot;  
    my $zeile_butter;  
    my $zeile_kaese;  
      
    my @jede_menge_kaese_brote;  
      
    foreach $zeile_brot (@erst_brot)  
    {  
      foreach $zeile_butter (@dann_butter)  
      {  
        foreach $zeile_kaese (@zuletzt_kaese)  
        {  
          push (@jede_menge_kaese_brote,"$zeile_brot;$zeile_butter;$zeile_kaese");  
        }  
      }  
    }
    

    einfach von anfang an so angewöhnen ... sonst kommen schlimme verwechslungen raus ... wie gesagt sinngemaess :)

    Sonntags-Gruesse Gustl

    1. Moin!

      einfach von anfang an so angewöhnen ... sonst kommen schlimme verwechslungen raus ... wie gesagt sinngemaess :)

      Sagen wir mal so: Man sollte wissen, wann man das eine und wann man das andere verwendet.

      Die beiden sind nämlich nicht funktionsidentisch wie man hier schön sieht:

      #!/usr/bin/perl  
      use strict;  
      use warnings;  
        
      my @anfang=qw/Es war einmal ein Vater/;  
      my @ende=qw/so leben sie noch heute/;  
      my %zuordnung;  
      @zuordnung{@anfang}= @ende;  
        
      print "1. ";  
      foreach (@anfang) {  
       print " $_";  
      }  
      print ".\n";  
        
      print "1a.";  
      foreach my $t (@anfang) {  
       $_= $zuordnung{$t};  
       print " $_";  
      }  
      print ".\n";  
        
      print "2. ";  
      foreach (@anfang) {  
       print " $_";  
      }  
      print ".\n";  
        
      print "2a.";  
      foreach (@anfang) {  
       $_= $zuordnung{$_};  
       print " $_";  
      }  
      print ".\n";  
        
      print "3. ";  
      foreach (@anfang) {  
       print " $_";  
      }  
      print ".\n";  
      
      

      Ergebnis:
      1.  Es war einmal ein Vater.
      1a. so leben sie noch heute.
      2.  Es war einmal ein Vater.
      2a. so leben sie noch heute.
      3.  so leben sie noch heute.

      -- Skeeve

      1. gudn tach!

        einfach von anfang an so angewöhnen ... sonst kommen schlimme verwechslungen raus ... wie gesagt sinngemaess :)
        Sagen wir mal so: Man sollte wissen, wann man das eine und wann man das andere verwendet.

        Die beiden sind nämlich nicht funktionsidentisch wie man hier schön sieht:

        hmm, *gruebel*. ich finde nicht, dass man da gross einen unterschied sieht und bin sogar eher der meinung, dass da kein unterschied besteht, denn

        foreach my $t (@anfang){
        $_= $zuordnung{$t};
        print $_;
        }

        ist das gleiche wie

        my $t  
        foreach (@anfang){  
         $t= $zuordnung{$_};  
         print $t;  
        }
        

        und

        foreach (@anfang){
        $_= $zuordnung{$_};
        }

        ist das gleiche wie

        foreach my $t (@anfang){  
         $t= $zuordnung{$t};  
        }
        

        also entweder man verwendet die eine oder die andere moeglichkeit. beide zusammen geht halt nicht:

        foreach my $t (@anfang){  
         print $_;  
        }
        

        wuerde eine fehlermeldung ("uninitialized value") liefern.

        prost
        seth

        1. Moin!

          ;-) Deine Argumente sind nicht von der Hand zu weisen!

          -- Skeeve