Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Sorting an array

0 views
Skip to first unread message

gamo

unread,
Dec 18, 2009, 5:38:44 PM12/18/09
to

This code

@sorted = sort {
field4($a) <=> field4($b) ||
field1($a) <=> field1($b)
} @oferta;

simply don't work.

The error message is

Undefined subroutine &main::field4 called at subasta.pl line 30.

Any help is appreciated.


--
http://www.telecable.es/personales/gamo/
Honesta turpitudo est pro causa bona --Publilius Syrus
"Was it a car or a cat I saw?"
perl -E 'say 111_111_111**2;'

J�rgen Exner

unread,
Dec 18, 2009, 6:03:05 PM12/18/09
to
gamo <ga...@telecable.es> wrote:
>This code
>
>@sorted = sort {
> field4($a) <=> field4($b) ||
> field1($a) <=> field1($b)
>} @oferta;
>
>simply don't work.
>
>The error message is
>Undefined subroutine &main::field4 called at subasta.pl line 30.

Well, yeah, sorry for asking the obvious, but did you define a function
field4() in your main program? You are using it in the comparision, but
perl can't find it.

jue

gamo

unread,
Dec 18, 2009, 6:19:31 PM12/18/09
to

I'm afraid I take the FAQ suggestion too literally.
How can be that subs be writed?

The array @oferta has $oferta[0 to .5M][0 to 3]

TIA

J�rgen Exner

unread,
Dec 18, 2009, 7:54:08 PM12/18/09
to
gamo <ga...@telecable.es> wrote:

>On Fri, 18 Dec 2009, J�rgen Exner wrote:
>
>> gamo <ga...@telecable.es> wrote:
>> >This code
>> >
>> >@sorted = sort {
>> > field4($a) <=> field4($b) ||
>> > field1($a) <=> field1($b)
>> >} @oferta;
>> >
>> >simply don't work.
>> >
>> >The error message is
>> >Undefined subroutine &main::field4 called at subasta.pl line 30.
>>
>> Well, yeah, sorry for asking the obvious, but did you define a function
>> field4() in your main program? You are using it in the comparision, but
>> perl can't find it.
>
>I'm afraid I take the FAQ suggestion too literally.
>How can be that subs be writed?
>
>The array @oferta has $oferta[0 to .5M][0 to 3]

Insufficient information. Please post a minimal but complete program
that we can compile and run. In your case what we really really need is
an actual sample of your data structure (make sure your program creates
that) as well as a clear, precise description of your sort criteria.

jue

Jim Gibson

unread,
Dec 18, 2009, 9:12:41 PM12/18/09
to
In article <alpine.LNX.2.00.0...@jvz.es>, gamo
<ga...@telecable.es> wrote:

> On Fri, 18 Dec 2009, J�rgen Exner wrote:
>
> > gamo <ga...@telecable.es> wrote:
> > >This code
> > >
> > >@sorted = sort {
> > > field4($a) <=> field4($b) ||
> > > field1($a) <=> field1($b)
> > >} @oferta;
> > >
> > >simply don't work.
> > >
> > >The error message is
> > >Undefined subroutine &main::field4 called at subasta.pl line 30.
> >
> > Well, yeah, sorry for asking the obvious, but did you define a function
> > field4() in your main program? You are using it in the comparision, but
> > perl can't find it.

>

> I'm afraid I take the FAQ suggestion too literally.
> How can be that subs be writed?
>
> The array @oferta has $oferta[0 to .5M][0 to 3]

If you mean that the @oferta array has 500_000 elements, each of which
is a reference to an array with 4 elements, and you want to sort the
@oferta array using the numerical value of the fourth element of the
referenced arrays as a primary key and the numerical value of the first
element as a secondary key, then what you want is (untested):

@sorted = sort {
$a->[3] <=> $b->[3] ||
$a->[0] <=> $b->[0]
} @oferta;

--
Jim Gibson

gamo

unread,
Dec 19, 2009, 2:39:02 AM12/19/09
to

This is exactly what I want. Thank you very much.


> --
> Jim Gibson

ccc31807

unread,
Dec 19, 2009, 11:25:44 AM12/19/09
to
On Dec 18, 5:38 pm, gamo <g...@telecable.es> wrote:
> This code
>
> @sorted = sort {
>     field4($a) <=> field4($b) ||
>       field1($a) <=> field1($b)
>
> } @oferta;
>
> simply don't work.

Here is an example of working code (not sorting a hash but an array,
but it shouldn't make any difference):

foreach my $key (sort {
$memberhash->{$a}{'membertype'} cmp $memberhash->{$b}
{'membertype'} ||
$memberhash->{$a}{'last'} cmp $memberhash->{$b}{'last'} ||
$memberhash->{$a}{'first'} cmp $memberhash->{$b}{'first'} }
keys %{$memberhash})

This uses the block style rather than the function style. You might
translate this into an array sort similar to this:

foreach my $element (sort
{
#here is the specific sort criteria, like $a <=> $b
}
@my_array)
{
print "This is the element: $element\n";
push @sorted, $element; #inverse sort
}

CC.

0 new messages