That line just says...
* If $head is true, then leave it alone, else set it to the value of
$link
(aka: $head ||= $link _is the same as_ $head = $head || $link)
simran.
On Tue, 2002-12-10 at 13:34, Mark Goland wrote:
> Ok I got it working now, thanx much Jason. Only question I have is regarding
> this.
>
> >$head ||= $link;
>
> What is this line doing ??
>
> Mark
> ----- Original Message -----
> From: "Jason Tiller" <[EMAIL PROTECTED]>
> To: "perl" <[EMAIL PROTECTED]>
> Sent: Monday, December 09, 2002 3:16 PM
> Subject: Re: linked list's
>
>
> > Hi, Mark, :)
> >
> > On Sun, 8 Dec 2002, Mark Goland wrote:
> >
> > > I am having problems printing this doubly list. the bug statment
> > > prints the expacted so I think I have the list setup right, but I
> > > cant get this list to print in reverse... any ideas ??
> >
> > > #!/usr/bin/perl -w
> >
> > # Always do this.
> > use strict;
> > use warnings;
> >
> > > $debug=1;
> >
> > > for($i=1;$i<10;$i++){
> > > $list = {value=>$i,prev=>$list,next=>${prev} };
> > > print "prev=$prev\tlist=$list\n" if( $debug);
> > > $prev= $list;
> > >
> > > }
> >
> > Since $prev and $list are global variables and you always set $prev to
> > list in the loop, how do you expect to go backwards ("reverse") with
> > your second iterator? $prev == $list at the end of every iteration!
> > The only way to go backwards would be to store the head of the list
> > like so:
> >
> > my $head;
> >
> > for( my $i = 1;... ) {
> > $list = ...;
> > $head ||= $list;
> > ...
> > }
> >
> > That sets head equal to the first list member you create.
> >
> > However, you have a larger problem. You can't possibly go backwards
> > because your first element has both ->{next} *and* ->{prev}
> > undefined. This shouldn't be the case in a double-linked list.
> >
> > Also, your algorithm is incorrect. If you slightly change the debug
> > output statement to look like this:
> >
> > printf "\$list->{prev} = %s \t \$list->{next} = %s\n",
> > $list->{prev},
> > $list->{next} if $debug;
> >
> > You'll see the problem. Here's a sample run:
> >
> > $ ./bob.pl
> > Use of uninitialized value in printf at ./bob.pl line 12.
> > Use of uninitialized value in printf at ./bob.pl line 12.
> > $list->{prev} = $list->{next} =
> > $list->{prev} = HASH(0xa04116c) $list->{next} = HASH(0xa04116c)
> > $list->{prev} = HASH(0xa066678) $list->{next} = HASH(0xa066678)
> > $list->{prev} = HASH(0xa066630) $list->{next} = HASH(0xa066630)
> > $list->{prev} = HASH(0xa0665e8) $list->{next} = HASH(0xa0665e8)
> > $list->{prev} = HASH(0xa0665a0) $list->{next} = HASH(0xa0665a0)
> > $list->{prev} = HASH(0xa066558) $list->{next} = HASH(0xa066558)
> > $list->{prev} = HASH(0xa066510) $list->{next} = HASH(0xa066510)
> > $list->{prev} = HASH(0xa0664c8) $list->{next} = HASH(0xa0664c8)
> >
> > Umm, ->{prev} and ->{next} are the SAME FOR EVERY ELEMENT. So, you've
> > in a sense created a single linked list with an additional, un-needed
> > data member for each element.
> >
> > The problem is that when creating a linked list, you never know the
> > address (er, reference in perl) of the *next* element. So, in your
> > loop you have to "look back" and set the previous element's ->{next}
> > "pointer" (again, "reference" in perl) to the current element. Your
> > algorithm didn't do this; hence the single linked list you created.
> >
> > Try this on for size:
> >
> > my ($head, $tail);
> >
> > my $link;
> > for( my $i = 1; $i < 10; ++$i ) {
> > $link = { value => $i,
> > next => undef,
> > prev => $link };
> > $head ||= $link;
> > $link->{prev}->{next} = $link if $link->{prev};
> > }
> > $tail = $link;
> >
> > Let me know if you have any questions.
> >
> > ---Jason
> >
> >
> > --
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]