2016-07-09 8 views
-3
sub main(int argc, char *argv[]) { 

    my $j = '@b(defgh|jk3m#9pqr$+uvwxy2'; 

    for (int $i = 0; $i < 32; ++$i) { 
     print (grep {/\S/} split('\W|', $j))[$i % (split('', $j))[11] + $i % (split('',$j))[25] * $i % 19]; 
    } 

    print "\n"; 

    return 0; 
} 

main() unless caller; 

Wo ist mein Fehler? Ich kann es nicht finden. aber ich weiß, dass es wahrscheinlich innerhalb der for Schleife istCodefehler finden

+4

Um zu verdeutlichen, warum diese Frage geschlossen war: Wir sollten nicht versuchen zu erraten, was der "Fehler" ist. Wir haben keine Ahnung, was dieser Code überhaupt tun soll. Was Sie in der Frage, _besides_ der betreffende Code, klar darstellen sollten, ist 1) was Sie erwarten, dass der Code zu tun, 2) was sind die genauen Fehler, falls vorhanden, 3) was das Ergebnis falsch, wenn überhaupt. – Xan

Antwort

6

Sie versuchen, Perl mit C-Konstrukten zu schreiben.

  1. Verwenden Sie strict und warnings, um häufige Fehler zu vermeiden.
  2. Entfernen C Konstrukt int argc, char *argv[].
  3. Entfernen Sie C Konstrukt int $i=0;$i<32;++$i, können Sie C-style Schleifen in Perl schreiben, aber es ist nicht sehr perlisch.
  4. Brechen Sie lange komplexe Ausdrücke in Teile, damit Sie die Teile leicht debuggen können.
  5. main unless caller ist eine seltsame Konstruktion. Wenn Sie dies als Bibliothek verwenden möchten, rufen Sie nicht Ihre Funktion main auf und lesen Sie perldoc perlmod.
  6. Ein-Buchstaben-Variablen sind normalerweise schrecklich und sollten besser umbenannt werden.
  7. Die Verwendung von magischen Zahlen in Ihrem Code ist fehleranfällig, es gibt keine Möglichkeit zu wissen, ob sie korrekt sind.
  8. Es gibt weitere Verbesserungen, die vorgenommen werden können, einschließlich der Verschiebung der geteilten Anweisungen außerhalb der Schleife.

Code Umschreiben, erhalte ich folgendes:

#!/usr/bin/env perl 

use warnings; 
use strict; 

main(); 

sub main { 
    my $j = '@b(defgh|jk3m#9pqr$+uvwxy2'; 
    for my $i (0 .. 31) { 
     my @characters = grep { /\S/ } split /\W|/, $j; 

     my ($first_mod) = (split//,$j)[11]; 
     my $first_index = $i % $first_mod; 

     my ($second_mod) = (split//,$j)[25]; 
     my $second_index = $i % $second_mod * $i % 19; 

     print $characters[ $first_index + $second_index ]; 
    } 
    print "\n"; 
    return 0; 
} 

Ausgabe

beefdkb3emdrbuevd2bdeedjbke3dqbr 

Weiterführende Literatur

perldoc perlintro

perldoc perltrap C/C++ traps
+1

Gut .. Ich mochte die saubere und ordentliche Darstellung ..! Danke für das Teilen. –