Schrift
[thread]10560[/thread]

wie funktioniert der Befehl push()



<< >> 8 Einträge, 1 Seite
#Kein Kommentar
 2007-10-11 15:17
#100672 #100672
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
hi,

die überschrift sagt eigentlich schon alles.

Wie kann der push-befehl ein array verändern, obwohl doch garnicht die referenz des arrays, sondern nur der inhalt übergeben wird?

Code: (dl )
push (@array, $scalar);


@array is ja eindeutig keine referenz. Wie kann das dann funktionieren?

----
Modedit Gwendragon:
Titel geändert
----
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
renee
 2007-10-11 15:25
#100673 #100673
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mit Prototypen...
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

sub mypush(\@$);

my @array = (1..7);
mypush( @array, "Hallo");

print Dumper \@array;


sub mypush(\@$){
    my ($ar,$scalar) = @_;
    push @$ar, "Hinzugefuegt: $scalar";
}


Damit (\@) sagst Du, dass das Array als Arrayreferenz behandelt werden soll...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2007-10-11 16:59
#100685 #100685
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
wobei die built-in funktionen speziell sind. z.b. lässt sich ein map() nicht so einfach
nachbauen, denn map lässt sich auf zwei arten aufrufen:
Code: (dl )
1
2
map { foo() } @a;
map foo(), @a;
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
RPerl
 2007-10-11 21:59
#100701 #100701
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Ich frage mich, warum renee kein

"Subroutine foo redefined".

bekommt.
Linuxer
 2007-10-11 22:22
#100703 #100703
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Warum sollte foo angemeckert werden? Er nennt sie doch mypush ;o)) SCNR

Code: (dl )
sub mypush(\@$);


ist die Deklaration für mypush(), also die reine Bekanntgabe. Das braucht es, wenn der eigentliche "Main"-Teil des Skriptes vor der Definition der Sub steht. Tut es das nicht, meldet Perl:

Quote
main::mypush() called too early to check prototype at prototype.pl line 9.
Can't use string ("1") as an ARRAY ref while "strict refs" in use at prototype.pl line 16.


Erst wenn Du die Definition der Sub *vor* das Main-Skript stellst, kannst Du Dir die explzite Deklaration vorher sparen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

# Deklaration + Definition
sub mypush(\@$){
my ($ar,$scalar) = @_;
push @$ar, "Hinzugefuegt: $scalar";
}

my @array = (1..7);
mypush( @array, "Hallo");

print Dumper \@array;


Das ist eigentlich das Verhalten, dass ich noch aus meinen C-Anlern-Zeiten und den entsprechenden Programmcodes kenne.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
renee
 2007-10-11 23:35
#100709 #100709
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich habe die Subs aber lieber am Ende... Dann habe ich das "Hauptprogramm" gleich im Blick wenn ich die Datei öffne.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Linuxer
 2007-10-12 11:46
#100739 #100739
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
renee+2007-10-11 21:35:56--
Ich habe die Subs aber lieber am Ende... Dann habe ich das "Hauptprogramm" gleich im Blick wenn ich die Datei öffne.

Mach ich i.A. genauso.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
lichtkind
 2007-10-12 13:33
#100747 #100747
User since
2004-03-22
5697 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
ich glaub die grdankenblockade von kein kommentar ist zu glauben das @ keine referenz anzeigt. natürliche ist zeigt das eine referenz an. nur halt eine spezialisierte referenz typ für arrays. ein $ fereferenziert ja auch skalarwerte, siehe $$var.
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
<< >> 8 Einträge, 1 Seite



View all threads created 2007-10-11 15:17.