fivemack: (spiky)
Tom Womack ([personal profile] fivemack) wrote2006-12-20 05:49 pm
Entry tags:

hair-tearing perl question

What I want: a subroutine footle such that, if you call footle(a,b) twice with the same a,b, it does nothing the second time

What I did:
use strict;
sub footle
{
  my ($a,$b,%done) = @_;
  my $concat = $a.$b;
  if ($done{$concat} == 0)
  {
    print "footling $a $b";
    $done{$concat} = 1;
  }
}

my %isdone = ();

footle("bootle","bumtrinket",%isdone);
footle("bootle","bumtrinket",%isdone);

But this doesn't work because parameters are passed by value.

But if I call as footle("bootle","bumtrinket",\%isdone), which passes isdone by reference, it still does the footling twice.

Even if I put $_[2]=%done before the end of the subroutine, it still does the footling twice.

And if I put print join "*",(keys %done); at the start of the subroutine, it says HASH(0x8188110)footling bootle bumtrinket

So how do I really pass the parameter by reference, as if I'd said void footle(int a, int b, set<string>& done) in C++?

[identity profile] fivemack.livejournal.com 2006-12-21 12:45 am (UTC)(link)
Function templates? I didn't think perl had them ... it'd be wonderful if there was some way of getting compile-time or run-time errors, rather than wrong behaviour, if with footle as [livejournal.com profile] hsenag had it, I did


def wurble
{
my ($a,$b,$c,$done) = @_;
footle($a,$b,$done);
footle($a,$c,$done);
footle($c,$b,$done);
}


and then called wurble("left","right","middle",%frog) rather than wurble("left","right","middle",\%frog).

Googling on 'perl function template' gives me a rather sophisticated way of generating stereotyped functions of the form


*$fname = sub { print join "*",$fname,@_ }

but that isn't really what I want.

[identity profile] dd-b.livejournal.com 2006-12-21 01:15 am (UTC)(link)
The term I wanted was "prototypes"; see man perlsub, and while you look at the prototypes section, you might also want to check the "pass by reference" section and the "persistent local variables" section.