Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6128[/thread]

Arrayslice

Leser: 1


<< |< 1 2 >| >> 17 Einträge, 2 Seiten
Crian
 2004-03-09 11:41
#80766 #80766
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ich wollte gerade zur Demonstartion des Unterschiedes zwischen @array[2] und $array[2] etwas Code schreiben, allerdings muss ich feststellen, dass Perl mich austrickst.

Ich hätte gedacht, das Arraystück @array[2] wäre ein Array mit einem Element (nämlich dem dritten Element des ursprünglichen Arrays), aber anscheinend wird daraus sofort ein skalarer Wert erzeugt.

Das ist für mich eigentlich schon sehr nahe am Bug, oder mein Verständnis für Arrays / Arrayslices hat da noch eine Lücke...
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
havi
 2004-03-09 11:45
#80767 #80767
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl

use warnings;
use strict;

my @array = ("1", "2", "3", "4", "5");

print $array[2]; # funzt


Code: (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl

use warnings;
use strict;

my @array = ("1", "2", "3", "4", "5");

print @array[2]; # Scalar value @array[2] better written as $array[2]...
Crian
 2004-03-09 11:47
#80768 #80768
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ja, das ist schon klar, aber was mich wundert ist, dass er einen skalaren Wert daraus macht.

Etwa:

Code: (dl )
1
2
3
4
5
6
use strict;
use Data::Dumper;
my @array = (1..9);
print scalar @array[2], "\n";
print Dumper(@array[2]);
print Dumper($array[2]);


ergibt

Code: (dl )
1
2
3
4
5
Scalar value @array[2] better written as $array[2] at C:\Daten\perl\forum\Arrayslice_Arrayelement.pl line 4.
Scalar value @array[2] better written as $array[2] at C:\Daten\perl\forum\Arrayslice_Arrayelement.pl line 5.
3
$VAR1 = 3;
$VAR1 = 3;


Warum? Niemand wollte in Zeile 4 einen skalaren Wert ;)\n\n

<!--EDIT|Crian|1078825786-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2004-03-09 11:54
#80769 #80769
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Anscheinend habe ich eine echte Lücke zum Thema Arrayslice:

Code: (dl )
1
2
3
4
5
use strict;
use Data::Dumper;
my @array = (1..9);
print scalar(@array[2,3]), "\n";
print Dumper(@array[2,3]);


die Ausgabe

Code: (dl )
1
2
3
4
$VAR1 = 3;
$VAR2 = 4;


empfinde ich als echte Frechheit. Wieso bitte hat das Arrayslice 4 Elemente (ja ist wohl der Wert des letzten Elementes des Slices, aber was soll das???).
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Ronnie
 2004-03-09 12:08
#80770 #80770
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Habe es auch mal probiert, ist wirklich interessant.
Code: (dl )
1
2
3
4
5
6
use strict;

my @array = (1..9);
print scalar(@array[2,3]), "\n";
my @box = @array[2,3];
print scalar(@box), "\n";

Nach der Zuweisung klappt es erwartungsgemäß.
kabel
 2004-03-09 12:13
#80771 #80771
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
riecht ja fast nach bug...
auf rt.perl.org ist nix mit "slice" als betreff gelistet ...
-- stefan
Ronnie
 2004-03-09 12:14
#80772 #80772
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Ist aber so dokumentiert:

Quote
Because scalar is unary operator, if you accidentally use for EXPR a parenthesized list, this behaves as a scalar comma expression, evaluating all but the last element in void context and returning the final element evaluated in scalar context. This is seldom what you want.

scalar
Also geht es so:
Code: (dl )
print scalar @{[ (@array[2,3]) ]}, "\n";
ptk
 2004-03-09 12:15
#80773 #80773
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Da wird wahrscheinlich der subtile Unterschied zwischen Liste und Array zugeschlagen haben. Aber fragt mich nicht nach Details, die moechte ich auch nicht wissen :-)
kabel
 2004-03-09 12:27
#80774 #80774
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
SCNR
super, es ist dokumentiert ... 8)
passt ja zu pq's signatur ...
-- stefan
pq
 2004-03-09 12:58
#80775 #80775
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
ein array-slice ist eine liste, kein array. das ist der wichtigste punkt bei der sache.
wen man sich das mal überlegt, ist es auch logisch: woher sollte das array kommen?
wenn ich per @{ EXPR } ein array bekomme, wird da on-the-fly
ein anoymes array angelegt, aber bei @array[...] wird keins
angelegt.
dagegen gibt es ein anderes phänomen:
@array = 2,3,4;
jetzt rätselt mal rum, was rauskommt und warum.
jemand lust auf mehr?
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
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2004-03-09 11:41.