Schrift
[thread]11351[/thread]

Arrays are not lists



<< |< 1 2 >| >> 15 Einträge, 2 Seiten
KurtZ
 2008-02-23 17:30
#106297 #106297
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Hi

Eine typische Falle sind die subtilen Unterschiede zwischen Lists und Arrays.

Jetzt hab ich mir die Frage gestellt, wie man den Arrayslice in -> Arrays are not lists am effizientesten als Array zurückgeben kann, wenn man den scalaren Kontext bedienen möchte.

Kennt jemand kürzere Lösungen für ret_slice_arr() ??

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use strict;

our $\="\n";

my @A=qw< a b c>;


sub ret_array {
    return @_;
}

sub ret_list {
    return @_[0..$#_];
}

sub ret_slice_arr1 {
        return @{[@_[0..$#_]]};
}

sub ret_slice_arr2 {
        return my @a= @_[0..$#_] ;
}


print scalar(ret_array(@A));                    #> 3    
print scalar(ret_list(@A));                             #> 0
print scalar(ret_slice_arr1(@A));               #> 3
print scalar(ret_slice_arr2(@A));               #> 3
TMTOWTDYOG (there's more than one way to dig your own grave)
pq
 2008-02-23 18:21
#106298 #106298
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Code (perl): (dl )
1
2
3
sub ret_slice_array3 {
    return () = @_[0..$#_];
}
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
KurtZ
 2008-02-23 18:58
#106299 #106299
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
pq+2008-02-23 17:21:50--
Code (perl): (dl )
1
2
3
sub ret_slice_array3 {
    return () = @_[0..$#_];
}


DANKE ...aber verstehe ich das richtig, ich weise eine Liste einer anonymen Liste zu und bekomme ein Array?


...it's a kind of Magic...
TMTOWTDYOG (there's more than one way to dig your own grave)
betterworld
 2008-02-23 19:17
#106300 #106300
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
KurtZ+2008-02-23 17:58:29--
pq+2008-02-23 17:21:50--
Code (perl): (dl )
1
2
3
sub ret_slice_array3 {
    return () = @_[0..$#_];
}


DANKE ...aber verstehe ich das richtig, ich weise eine Liste einer anonymen Liste zu und bekomme ein Array?


...it's a kind of Magic...


Listen sind immer anonym... sonst waeren es ja Arrays.

Du meinst eine leere Liste. Der Trick ist, dass bei einer Listenzuweisung die Anzahl der Elemente zurueckgegeben wird.
KurtZ
 2008-02-23 19:25
#106301 #106301
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
betterworld+2008-02-23 18:17:22--
Du meinst eine leere Liste. Der Trick ist, dass bei einer Listenzuweisung die Anzahl der Elemente zurueckgegeben wird.


argh ... das heißt im listenkontext kommt nix an

Code (perl): (dl )
1
2
3
4
5
print ret_array(@A);                    #: abc
print ret_list(@A);                             #: abc
print ret_slice_arr1(@A);               #: abc
print ret_slice_arr2(@A);               #: abc
print ret_slice_arr3(@A);               #: nix, nada, nothing BUMM!
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-02-23 19:29
#106302 #106302
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
betterworld+2008-02-23 18:17:22--
Listen sind immer anonym... sonst waeren es ja Arrays.


ich hab Benennungsprobleme!
{} = ref anonymer Hash
[] = ref anonymes Array
() = ??? ... nagut ... leere Liste
TMTOWTDYOG (there's more than one way to dig your own grave)
pq
 2008-02-23 19:29
#106303 #106303
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
KurtZ+2008-02-23 18:25:28--
argh ... das heißt im listenkontext kommt nix an

ach je, dann vergiss meinen ansatz =)
hatte mich auf den skalaren kontext konzentriert...
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
pq
 2008-02-23 19:31
#106305 #106305
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
KurtZ+2008-02-23 18:29:03--
betterworld+2008-02-23 18:17:22--
Listen sind immer anonym... sonst waeren es ja Arrays.


ich hab Benennungsprobleme!
{} = ref anonymer Hash
[] = ref anonymes Array
() = ??? ... nagut ... leere Liste

der punkt ist, [] und {} sind datenstrukturen, die als variable (anonym) irgendwo im
speicher sind. () ist keine datenstruktur, sondern nur eine 'verpackung' für
weitergereichte daten.
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
betterworld
 2008-02-23 19:34
#106306 #106306
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
KurtZ+2008-02-23 18:29:03--
ich hab Benennungsprobleme!
{} = ref anonymer Hash
[] = ref anonymes Array
() = ??? ... nagut ... leere Liste

Naja, dein anonymer Hash und dein anonymes Array sind ja ebenfalls leer. Verstehe gerade die Benennungsprobleme nicht... Leer heisst halt einfach, es steht nichts zwischen den Klammern ;)
KurtZ
 2008-02-24 17:39
#106314 #106314
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
pq+2008-02-23 18:29:11--
ach je, dann vergiss meinen ansatz =)
hatte mich auf den skalaren kontext konzentriert...


hmm , der Gedanke war vielleicht auch nicht zu blöd:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
use strict;

our $\="\n",$,="\t";

my @A=qw< a b c>;

sub ret_slice_arr3 {
    return @{[]} = @_[0..$#_];
}

print scalar( ret_slice_arr3(@A) ),ret_slice_arr3(@A);  #: 3    a       b       c


sowas funktioniert übrigens auch (wenn man gerne in die Hölle der Obfuscator will *fg*)

Code (perl): (dl )
1
2
3
sub ret_slice_arr3 {
    return @ .= @_[0..$#_];
}
TMTOWTDYOG (there's more than one way to dig your own grave)
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2008-02-23 17:30.