Dar vieno analitiko svetainė

Petras Kudaras

Rikiavimas Perlo programavimo kalboje

Prieš savaitę Džibas aprašė rikiavomus Python kalba, tad sumaniau jog nereikia atsilikti, ir bandysiu pateikti analogiškus Perl rikiavimo būdus ;)

Paprasčiausiai rikiuoti masyvo elementus didėjimo tvarka užtenka iškviesti funkciją sort:

@a = (0,3,5,3,1,2,4,6,2,4,5,7,3);
my @a = sort @a;
print "$_ " for @a;

Spausdina:

0 1 2 2 3 3 3 4 4 5 5 6 7

Kaip ir Pitone, galima pasirašyti savo rikiavimo funkciją:

my @a = (0,3,5,3,1,2,4,6,2,4,5,7,3);
@a = sort { $a - $b } @a;
print "$_ " for @a;

Spausdins tą patį kaip ir prieš tai.

Toliau Džibas parodė kaip rikiuoti hešų hešus (hmm… ten šiaip gi logiškai turėtų būti hešų masyvas…). Taigi toks pat pavyzdys su Perlu (tik su hešų masyvu):

my @a = ( { 'item' => 6, 'zodis' => 'ka' },
          { 'item' => 2, 'zodis' => 'kva'},
          { 'item' => 5, 'zodis' => 'kre'} );
@a = sort { $a->{'item'} <=> $b->{'item'} } @a;
print "item: $_->{'item'} zodis: $_->{'zodis'} \n" for @a;

Spausdina:

item: 2 zodis: kva
item: 5 zodis: kre
item: 6 zodis: ka

O va taip rikiuojami objektai:

package Objektas;
sub naujas {
	my ($self, $skaicius) = @_;
	bless {'skaicius' => $skaicius}, $self;
}
sub kasastoks {
	my $self = shift;
	print "Esu objektukas nr. $self->{'skaicius'}\n";
}
package main;
my @objMasyvas = (Objektas->naujas(3),
		  Objektas->naujas(2),
 		  Objektas->naujas(19),
		  Objektas->naujas(1));
@objMasyvas = sort { $a->{'skaicius'} 
                          <=> 
                     $b->{'skaicius'} } @objMasyvas;
$_->kasastoks() for @objMasyvas;

Tai spausdina:

Esu objektukas nr. 1
Esu objektukas nr. 2
Esu objektukas nr. 3
Esu objektukas nr. 19

O pasižaidimui, šiek tiek sutrumpintas kodas, darantis visiškai tą patį :)

package Objektas;
sub naujas    { bless {'skaicius' => $_[1]}, $_[0]; }
sub kasastoks {	print "Esu objektukas nr. $_[0]->{'skaicius'}\n"; }
package main;
my @objMasyvas = map { Objektas->naujas($_) } (3,2,19,1);
@objMasyvas = sort { $a->{'skaicius'} <=> $b->{'skaicius'} } @objMasyvas;
$_->kasastoks() for @objMasyvas;