2 Fragen zu Perl Arrays

  • Hallo Leute,


    ich hab' weder hier noch bei selfhtml/perl was dazu gefunden. Also ich will:


    1.) Teile eines Arrays concatenieren, also
    @arr1[$i] = join ("/", @arr1[$i], @arr2[$j]);
    Perl meckert mich an mit: Scalar value @arr2[$j] better written as $arr2[$j] at ./mk_dir.pl line 37.
    Komischerweise ist arr2 als @arr2 deklariert und gefuellt... Die gleiche Meldung kommt auch mit arr1


    2.) Ich moechte mehrere gleichlange arrays in eine Subroutine uebergeben, also z.B. Aufruf mit $rc = subroutine($num, @arr1, @arr2);
    Wieso geht das nicht, ich kriege in der Subroutine nur Muell (mit den Zuweisungen @arr1 = shift und @arr2 = shift). Weiss jemand, wie das geht?


    Sorry, aber ich steh' auf dem Schlauch...


    Gruss,
    - berndl


    [EDIT]
    aehm, und 3.) Wie sortiere ich strings (z.B. alphabetisch). Also in der Art:
    if ($str1 > $str2)
    { .... }
    [/EDIT]

  • dann will ich mir auch mal selber antworten:


    1.) ist nur ne warning, funktioniert trotzdem


    2.) die globalen arrays koennen auch in der subroutine beackert werden, tut also im Prinzip auch (ich weiss allerdings nicht was passiert, wenn ich in den arrays aendern will...)


    3.) ??? keine richtige Loesung gefunden. Ein 'sort' hilft mir nicht so recht weiter, da ich mehrere arrays habe die ich synchron aendern muss wenn die Sortierreihenfolge nicht stimmt.


    Gruss,
    - berndl

  • zu 1.)
    Ein Element eines Arrays was mit arr deklariert ist wird mit $arr[element] angesprochen. Mit arr[element(e)] kannst Du Array-Slices bearbeiten.


    zu 2.)
    Parameter werden in Perl immer als Liste übergeben, also der Aufruf subroutine($num, arr1, arr2) sorgt dafür dass in "subroutine" ein Array von Parametern ankommt, deren Inhalt $num gefolgt von den Elementen von arr1 gefolgt von denen von arr2 ist. Du bräuchtest hier Referenzübergabe, wenn Du die Arrays in der Funktion ändern willst:


    zu 3.)
    Strings lexikalisch vergleichen kannst Du mit den Operatoren eq (gleich), ne (ungleich), gt (greater-than), lt (less-than), ge (greater-equal) und le (less-equal) anstelle von ==, !=, >, <, >=, <=

  • Hi LordJaxom,


    zu 1.) Habe mittlerweile auch ein paar Sachen darueber rausgefunden, deine Antwort bringt es aber kurz und knackig auf den Punkt. Danke!
    zu 2.) Das hatte ich befuerchtet (da fehlen mir die Pointer von C...), mal sehen wie ich das hinkriege (so dass ich's in einem Jahr auch noch verstehe)
    zu 3.) ups, das hatte ich bisher noch nie gesehen, sieht ja fast wie FORTRAN aus :o) Probier ich mal aus


    Gruss+Danke,
    - berndl

  • zu 2. und 3.:
    Funktioniert spitze! Was mich nur wundert, ist, dass ich auf mit 'my' deklarierte globale arrays in einer Subroutine einfach so zugreifen kann und auch umsortieren kann.
    Naja, es tut jetzt!


    Gruss+Danke,
    - berndl

  • Hihi, da alle Fragen schon konstruktiv beantwortet wurden, quassle ich einfach mal dazwischen :ot . :lachen3


    Zitat

    zu 2.) Das hatte ich befuerchtet (da fehlen mir die Pointer von C...),


    Wieso? Die Perl-Referenzen sind mindestens ebenso nützlich und unüberschaubar. Wer mal eine Referenz auf einen Hash mit Referenzen dereferenziert hat weiß, was ich meine.


    Zitat

    mal sehen wie ich das hinkriege (so dass ich's in einem Jahr auch noch verstehe)


    Hinkriegen könnte gehen, aber wer eigenes Perl nach einem Jahr noch lesen kann hat meine volle Hochachtung.


    Zitat

    zu 3.) ups, das hatte ich bisher noch nie gesehen, sieht ja fast wie FORTRAN aus :o)


    Oh - ein Veteran! g77 müsste auf dem vdr doch auch laufen, skripte doch mal damit. Mal sehen, wie viele Leute dir dann bei Fragen weiterhelfen können :monster2 Wieviele Lochkarten braucht man wohl für ein 001.vdr...? Auf die String-Vergleichsoperatoren falle ich übrigens auch regelmäßig rein.


    Grüße,
    Carsten


    P.S.: Hübsch und übersichtlich auf Windosen ist die Perl-HTML-Doku, die beim ActiveState Perl dabei ist. Komfortabler als die Manpages.


    Asrock 4CoreDualSATA2 R2.0, VIA KT800, Celeron 2800, 512 MB, 250 GB PATA System,
    4 x 250 GB SATA RAID 5 (No Spare) /video, c't-vdr 4.5 + e-tobi, dist-upgrade auf etch, Intel PRO/1000MT, Kernel 2.6.26-bpo
    2 x Hauppauge Nova-T 2, 2 x Hauppauge MediaMVP E1 unter VOMP

  • Hi Casimir,


    da ich kein Windows habe, kann ich deinen Rat mit der Doku leider nicht nachvollziehen.


    Ach ja, und die 'lt', 'le', 'gt', usw. kenne ich wirklich von FORTRAN (natuerlich mit dem . davor und danach). Ich fand' das damals eigentlich prima uebersichtlich (obwohl FORTRAN fuer 'normales' programmieren sicherlich nicht der Renner war...). Und ja, ich versuche zumindest, den Perl-Code von heute morgen noch zu verstehen. Ich wuerde zwar mit C leichter zum Ziel kommen, aber Perl als Interpreter hat einfach was fuer kleine Tools...


    Gruss+Danke,
    - berndl


    [EDIT] PS: Und nochwas, das arithmetische IF bleibt irgendwie doch unerreicht...[/EDIT]

  • Zitat

    2.) Ich moechte mehrere gleichlange arrays in eine Subroutine uebergeben, also z.B. Aufruf mit $rc = subroutine($num, @arr1, @arr2);


    nur so ein tipp am rande:


    besser als ganze arrays zu übergeben ist es die referenz auf das array zu übergeben (pointer für die C leut).


    also so in etwa:



    edit:
    ups, hab grad gesehen dass das eh schon erklärt wurde. na egal
    ich lass das mal so stehen.

  • Zitat
    PHP
    $rc = subroutine($num, \@arr1, \@arr2);


    Da fällt mir spontan auf dass bei PHP-Tags die Backslashes bei der Anzeige unterschlagen werden (und ich wollte mich schon über den Code beschweren). Bei CODE-Tags nicht.. :schiel

  • So gehen die Meinungen auseinander. Ich fand immer das einzeln-rausshiften mit den Definitionen untereinander gereiht übersichtlicher ;)


    EDIT: An datoms Beispiel siehst Du übrigens schön das in Perl alles was in Klammern mit Komma getrennt auftaucht als Liste interpretiert wird.

  • Hi Lord Jaxom,


    yepp, die Sprache gefaellt mir immer besser.


    Angefangen mit Perl habe ich eigentlich aus 'Notwehr'! Ich hatte ein paar Gigabyte Messdaten im Geschaeft und musste mir ueber die Auswertung Gedanken machen. Die IT-Truppe hat auf jedem Rechner (Win 2000) Perl laufen um die zentralen Updates zu steuern. Antrag auf einen C-Compiler haette wohl mindestens 8 Wochen gedauert (vom Papierkram ganz zu schweigen) und so 'Geraffel' wie MatLab (haette auch wieder eine Lizenz bedeutet) mag ich nicht. Da hab' ich halt mal ganz unbefangen mit Perl losgelegt und innerhalb 2 Tagen eine perfekte Messdatenauswertung gehabt. Bin uebrigens kein Softie sondern komme von der Hardwarefraktion... Und da Perl nicht nur im Geschaeft auf Win2K laeuft sondern auch hier auf meiner Linux-Kiste lag die Wahl halt echt nahe. Ich muss mir doch mal ein Perl-Buch zum schmoekern zulegen.


    Gruss+Danke,
    - berndl

  • ja geschmäcker sind verschieden.
    ich persönlich mag die shift variante nicht so gern. find es auch nicht so leicht zu lesen im nachhinein.
    tja, aber wie die perl phil. schon sagt: there is more than one way to do it.


    durch das $rc = subroutine(...) kannst du auch gleich einen error_stack realisieren wenn du das ganze in ein if packst.
    das macht es möglich veschiedenste fehler zu tracen. macht meiner meinung nach aber nur sinn wenn die scripte grösser werden und von anderen usern verwendet werden sollen.

  • Zitat

    Original von datom
    durch das $rc = subroutine(...) kannst du auch gleich einen error_stack realisieren wenn du sollen.


    Hi datom,
    neenee, ich versuche schon, meine Skripte klein zu halten...
    Hab das aber mit deiner Loesung {parameter, ...} nicht hingekriegt und dann auch wieder das shift @_ verwendet.
    Funzt jetzt aber und ich hab' wieder was dazugelernt


    Gruss+Danke,
    - berndl

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!