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

Array sortieren das Strings und Interger enthaelt

Leser: 1


<< >> 10 Einträge, 1 Seite
roli
 2006-04-05 18:20
#64382 #64382
User since
2004-12-31
424 Artikel
BenutzerIn
[default_avatar]
Hi Leute,

ich habe ein Array, das Strings und Inter enthaelt das ich gerne sortieren moechte. Ich habe:
Code: (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
29
30
31
32
33
34
35
36
#!/usr/bin/perl -w

use strict;

my @argA = ('hallo', 3, 'Hallo', "", 22, "das war's" );
print "Unsortiert\n";
for (0..5) {
if(defined $argA[$_]) {
print "$_=$argA[$_] <\n";
}
else {
print "$_ ist undefiniert\n";
}
}

@argA = sort @argA;
print "\nSortiert, lexikalisch\n";
for (0..5) {
if(defined $argA[$_]) {
print "$_=$argA[$_] <\n";
}
else {
print "$_ ist undefiniert\n";
}
}

@argA = sort {$a <=> $b} @argA;
print "\nSortiert, numerisch aufsteigend\n";
for (0..5) {
if(defined $argA[$_]) {
print "$_=$argA[$_] <\n";
}
else {
print "$_ ist undefiniert\n";
}
}

Als Ergebnis des ganzen erhalte ich
Code: (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
Unsortiert
0=hallo <
1=3 <
2=Hallo <
3= <
4=22 <
5=das war's <

Sortiert, lexikalisch
0= <
1=22 <
2=3 <
3=Hallo <
4=das war's <
5=hallo <
Argument "" isn't numeric in ncmp at yy.pl line 27.
Argument "Hallo" isn't numeric in ncmp at yy.pl line 27.
Argument "das war's" isn't numeric in ncmp at yy.pl line 27.
Argument "hallo" isn't numeric in ncmp at yy.pl line 27.

Sortiert, numerisch aufsteigend
0= <
1=Hallo <
2=das war's <
3=hallo <
4=3 <
5=22 <

Vom Prinzip her gefaellt mir die numersch aufsteigende Sortierung am besten, nur die Fehlermeldungen sind halt Mist. Eine Sortierung die alles was an Integern im Array ist nurmerisch auf- bzw. absteigend sortiert, die Strings aber lexikalisch waere klasse. Wenn ich dabei noch festlegen koennte ob Integer vor Strings (oder andersherum) im Ergebnis landen sollen waere das erste Sahne, wobei das fuer mich/meine Anwendung eher ein Goodie waere.
Roland
--
"Steh vorn, während du fragst;
sitzen soll, wer antwortet."
Aus "Die Edda des Snorri Sturluson" "Gylfis Täuschung" Strophe 2
esskar
 2006-04-05 18:46
#64383 #64383
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use Scalar::Util qw[ looks_like_number ];

sub special_compare {
my ($x, $y) = @_;

if(&looks_like_number($x) and &looks_like_number($y)) {
return ($x <=> $y);
} else {
return (lc $x cmp lc $y);
}
}

my @argA = ('hallo', 3, 'Hallo', "", 22, "das war's" );
@argA = sort { special_compare($a, $b) } @argA;

print join("\n", @argA);
Strat
 2006-04-05 21:09
#64384 #64384
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich glaube, sowas wuerde ich sogar recht dirty coden:
Code: (dl )
1
2
3
4
5
6
@argA = sort {
no warnings;
$a <=> $b
or
lc($a) cmp lc($b)
} @argA;


@esskar: das special-compare wuerde ich anders aufrufen:
Code: (dl )
1
2
3
4
5
6
7
sub special_compare {
return $a <=> $b
if looks_like_number($a) and &looks_like_number($b);

return lc $a cmp lc $b;
}
@argA = sort special_compare @argA;

uebrigens:
Code: (dl )
return ($irgendwas)

kann unter umstaenden gefaehrlich werden (nicht in diesem fall), wenn die funktion im listenkontext aufgerufen wird; da wird naemlich eine liste mit einem element zurueckgegeben, was vielleicht bei wahrheitswerten mal true werden koennte
Code: (dl )
if (my @items = &DoWhatEver()) {

deshalb sowas immer ohne klammern returnen:
Code: (dl )
return $irgendwas;
\n\n

<!--EDIT|Strat|1144257544-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
esskar
 2006-04-06 02:01
#64385 #64385
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
bin momentan wieder viel an C++/C# programmieren. da behält man gerne mal den style für die perl-snippets, die man hier postet; außerdem sah mir [t]lc $a cmp lc $b[/t] so nackt aus -ohne klammern - und dann hab ich sie der Einheitlichkeit halber auch dem <=> Konstrukt gespendet!
Strat
 2006-04-06 12:18
#64386 #64386
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
aehnliche Probleme habe ich auch,wenn ich viel in Tcl schreibe... da wird dann ploetzlich geschrieben:
Code: (dl )
if { $irgendwas } {

und suche dann Fehler...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
roli
 2006-04-06 12:35
#64387 #64387
User since
2004-12-31
424 Artikel
BenutzerIn
[default_avatar]
Hi,

so'n Aerger, jetzt muss ich mir doch glatt noch ueberlegen welche der Loesungen ich verwenden werde ;)
Danke an alle, ihr habt mir mal wieder sehr geholfen.\n\n

<!--EDIT|roli|1144312623-->
Roland
--
"Steh vorn, während du fragst;
sitzen soll, wer antwortet."
Aus "Die Edda des Snorri Sturluson" "Gylfis Täuschung" Strophe 2
Dubu
 2006-04-06 23:48
#64388 #64388
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Strat,05.04.2006, 19:09]uebrigens:
Code: (dl )
return ($irgendwas)

kann unter umstaenden gefaehrlich werden (nicht in diesem fall), wenn die funktion im listenkontext aufgerufen wird; da wird naemlich eine liste mit einem element zurueckgegeben, was vielleicht bei wahrheitswerten mal true werden koennte
Code: (dl )
if (my @items = &DoWhatEver()) {

deshalb sowas immer ohne klammern returnen:
Code: (dl )
return $irgendwas;
[/quote]
Ich habe jetzt eine Zeitlang versucht, mir ein Beispiel zu konstruieren, das einen Unterschied zwischen return $foo und return ($foo) (und anderen Varianten) zu finden, aber es gelingt mir nicht:
Code: (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
29
30
31
32
33
34
#!/usr/bin/perl
use strict;
use warnings;

sub foo1 { return undef; }
sub foo2 { return (undef); }
sub foo3 { return(undef); }
sub foo4 { my @myarr; return @myarr; }
sub foo5 { my @myarr; return (@myarr); }
sub foo6 { my @myarr; return(@myarr); }
sub foo7 { return 1; }
sub foo8 { return (1); }
sub foo9 { return(1); }

use Data::Dumper;
my @arr1 = foo1();
my @arr2 = foo2();
my @arr3 = foo3();
my @arr4 = foo4();
my @arr5 = foo5();
my @arr6 = foo6();
my @arr7 = foo7();
my @arr8 = foo8();
my @arr9 = foo9();

print Dumper \@arr1;
print Dumper \@arr2;
print Dumper \@arr3;
print Dumper \@arr4;
print Dumper \@arr5;
print Dumper \@arr6;
print Dumper \@arr7;
print Dumper \@arr8;
print Dumper \@arr9;

Ausgabe:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$VAR1 = [
         undef
       ];
$VAR1 = [
         undef
       ];
$VAR1 = [
         undef
       ];
$VAR1 = [];
$VAR1 = [];
$VAR1 = [];
$VAR1 = [
         1
       ];
$VAR1 = [
         1
       ];
$VAR1 = [
         1
       ];

Hast du ein Beispiel, wo es wirklich einen Unterschied macht?
pq
 2006-04-07 01:10
#64389 #64389
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Strat,05.04.2006, 19:09]uebrigens:
Code: (dl )
return ($irgendwas)

kann unter umstaenden gefaehrlich werden (nicht in diesem fall), wenn die funktion im listenkontext aufgerufen wird; da wird naemlich eine liste mit einem element zurueckgegeben, was vielleicht bei wahrheitswerten mal true werden koennte[/quote]
nein, klammern machen da keinen unterschied.
es macht nur hier einen:
# $x == 23, Useless use of a constant in void context
my ($x, $y) = 23, 24;

# $x == 23, $y == 24
my ($x, $y) = (23, 24);


was man aber nicht tun sollte:
# ergibt im skalaren kontext undef, im listenkontext eine ein-elementige liste
return undef;


besser:
return;

edit: klammern vergessen...\n\n

<!--EDIT|pq|1144399870-->
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
esskar
 2006-04-07 01:15
#64390 #64390
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=pq,06.04.2006, 23:10][quote=Strat,05.04.2006, 19:09]uebrig
# $x == 23, Useless use of a constant in void context
my ($x, $y) = 23, 24;

# $x == 23, $y == 24
my ($x, $y) = 23, 24;
[/quote]
versteh ich das?

edit pq: huch, falscher beitrag editiert\n\n

<!--EDIT|pq|1144399842-->
renee
 2006-04-07 12:02
#64391 #64391
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Da hat pq wohl die Klammern unten vergessen...
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/
<< >> 10 Einträge, 1 Seite



View all threads created 2006-04-05 18:20.