Raik: zu PHP

Hallo, alle!

  
$a=r(999999998);  
$b=(r(50)+32)*10000+r(11)*100+r(27);  
$c=(r(5)+2)*10000+r(11)*100+r(27);  
printf("%09d%01dD<<%06d%01d<%06d%01d<<<<<<%01d\n",$a,c($a),$b,c($b),$c,c($c),(c($a)*8+c($b*100+c($b)*10)+c($c*10+c($c)))%  
10);  
sub r{  
    1+int(rand($_[0]));  
    }  
sub c{  
    $x=shift;  
    $t=0;  
    $s=1;  
    while($x){  
        $t+=($x%10)*$s;  
        $x=int($x/10);  
        $s=$s<6?(1+($s*2)):1  
        }  
    $t%10  
    }  

ich möchte dieses script nach php übertragen, bin mir aber mangels perl-kenntnissen nicht sicher, ob ich soweit alles richtig gemacht habe:

  
<?php  
$a=r(999999998);  
$b=(r(50)+32)*10000+r(11)*100+r(27);  
$c=(r(5)+2)*10000+r(11)*100+r(27);  
printf("%09d%01dD<<%06d%01d<%06d%01d<<<<<<%01d\n",$a,c($a),$b,c($b),$c,c($c),(c($a)*8+c($b*100+c($b)*10)+c($c*10+c($c)))%10);  
function r($i){  
     return 1+(int)(rand($i));  
     }  
function c($i){  
     $x=array_shift($i);  
     $t=0;  
     $s=1;  
     while($x){  
          $t+=($x%10)*$s;  
          $x=(int)($x/10);  
          $s=$s<6?(1+($s*2)):1;  
          }  
     return $t%10;  
     }  
?>  

es tritt ein fehler in 1+(int)(rand($i)); auf, obwohl die doku aussagt, dass die argumente optional sind.
ein weiterer fehler tritt in $x=array_shift($i); auf. da bin ich über die perl-syntax ratlos. wieso wird da in perl der variablen $x die funktion shift zugewiesen??? wie werden in perl parameter an die subroutinen übergeben?

freundl. Grüsse aus Berlin, Raik

--
Der IE ist wichtig. Man benötigt ihn, um sich einen Browser zu besorgen.
Resizeable Textarea 0.1a
  1. Hallo Raik,

    Btw: was soll denn der Code überhaupt machen? ;-)

    es tritt ein fehler in 1+(int)(rand($i)); auf, obwohl die doku aussagt, dass die argumente optional sind.

    Die deutsche Doku ist fehlerhaft, in der englischen Doku ist's klar: http://de3.php.net/en/rand - entweder gar kein Parameter oder halt beide - einer alleine geht nicht. Du suchst wahrscheinlich rand(0,$i).

    ein weiterer fehler tritt in $x=array_shift($i); auf. da bin ich über die perl-syntax ratlos. wieso wird da in perl der variablen $x die funktion shift zugewiesen??? wie werden in perl parameter an die subroutinen übergeben?

    Also, in Perl stehen in @_ alle Parameter der Subroutine. Wenn Du shift; machst, dann wird aus der Liste @_ der erste Wert geholt. D.h. mit

    sub c {  
      $x = shift;  
    }
    

    steht danach in $x der erste Parameter. Du hättest alternativ $x = $_[0]; machen können, wäre genauso gegangen (allerdings wird bei shift der Parameter aus der Liste entfernt, bei der einachen Zuweisung nicht - hier spielt das bloß keine Rolle). Du willst also in PHP den Parameter am besten $x statt $i nehmen und array_shift ganz bleiben lassen. Wenn Du es *wirklich* Perl-Style haben willst, dann musst Du in PHP folgendes machen:

    function c () {  
      $args = func_get_args();  
      $x = array_shift($args);  
    }
    

    Ist aber in der Form bei festgelegenten Parametern in PHP absoluter Schwachsinn, ist eigentlich nur interessant, wenn die Anzahl an Parametern variieren kann.

    Viele Grüße,
    Christian

    --
    "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
  2. Moin Raik,

    $a=r(999999998);  
    $b=(r(50)+32)*10000+r(11)*100+r(27);  
    $c=(r(5)+2)*10000+r(11)*100+r(27);  
    printf("%09d%01dD<<%06d%01d<%06d%01d<<<<<<%01d\n",$a,c($a),$b,c($b),$c,c($c),(c($a)*8+c($b*100+c($b)*10)+c($c*10+c($c)))%10);  
    function r($i){  
         return 1+(int)(rand(0,$i));  
         }  
    function c($i){  
         $t=0;  
         $s=1;  
         while($i){  
              $t+=($i%10)*$s;  
              $i=(int)($i/10);  
              $s=$s<6?(1+($s*2)):1;  
              }  
         return $t%10;  
         }
    

    sieht ja fast aus, wie der Kryptische Zeichensatz auf den Personalausweisen. Ist der das?

    Gruß aus Berlin!
    eddi

  3. Hell-O!

    es tritt ein fehler in 1+(int)(rand($i)); auf, obwohl die doku aussagt, dass die argumente optional sind.

    Der Perlcode war:

    1+int(rand($_[0]));

    Das bedeutet:

    Liefere den Ganzzahl-Teil einer Zufallszahl zwischen 0 und dem übergebenen Argument und addiere 1 dazu. Gib diesen Wert zurück.

    Die Funktion rand gibt's auch in PHP, int ist wohl am ehesten mit floor zu vergleichen. Eventuell kannst du dir die Ganzzahlerei sparen, da ich nicht weiß, ob PHP nur Ganzzahlen oder auch Gleitkommazahlen liefert.

    ein weiterer fehler tritt in $x=array_shift($i); auf. da bin ich über die perl-syntax ratlos. wieso wird da in perl der variablen $x die funktion shift zugewiesen???

    Nein, shift heißt in diesem Kontext einfach nur, dass der erste (bei mehreren der nächste) Parameter zugewiesen wird. Die einer Subroutine übergebenen Parameter befinden sich im Array @_, dieses kannst du auf verschiedene Arten abfragen:

    sub my_sub {  
      my @args = @_;  
      # mach was  
    }  
      
    sub my_sub {  
      my $arg1 = $_[0];  
      my $arg2 = $_[1];  
      # usw.  
    }  
      
    sub my_sub {  
      my $arg1 = shift;  
      my $arg2 = shift;  
      # usw.  
    }
    

    Es gibt auch noch mehr Möglichkeiten, für Details schau dir mal perlsub an. Mit diesem Verständnis sollte es nicht schwer sein, das Script von Perl nach PHP zu bekommen, oder?

    Siechfred

    1. Hallo Freunde des gehobenen Forumsgenusses,

      int ist wohl am ehesten mit floor zu vergleichen.

      findest du?

        
      echo (int)-5.5   # Ergibt -5  
      echo floor(-5.5) # Ergibt -6  
      
      

      Auch in PHP gibt es Typcasting :-)

      Gruß
      Alexander Brock

  4. Hallo,

    damit funktioniert es jetzt schon mal. :-)
    jetzt noch die optionale angabe der behördenkennzahl und des geburts- und ablaufdatums einbauen und dann hab ich meinen eigenen personalausweis-nummern-generator. :-D

      
    <?php  
    $a=r(999999998);  
    $b=(r(50)+32)*10000+r(11)*100+r(27);  
    $c=(r(5)+2)*10000+r(11)*100+r(27);  
    printf("%09d%01dD<<%06d%01d<%06d%01d<<<<<<%01d\n",$a,c($a),$b,c($b),$c,c($c),(c($a)*8+c($b*100+c($b)*10)+c($c*10+c($c)))%10);  
    function r($i){  
         return(1+(int)(rand(0,$i)));  
         }  
    function c($x){  
         $t=0;  
         $s=1;  
         while($x){  
              $t+=($x%10)*$s;  
              $x=(int)($x/10);  
              $s=$s<6?(1+($s*2)):1;  
              }  
         return($t%10);  
         }  
    ?>  
    
    

    zu finden ist das ganze auch beim ccc unter: http://www.ccc.de/updates/2002/personalID