my $coderef = sub {shift;};
my $val=$coderef->("Hello from down under");
sub doit{
print shift, $/;
}
&doit($val);
or another more succinct way of achieving the same
my $coderef = sub {shift;};
sub doit{
print shift, $/;
}
&doit($coderef->("Hello from down under"));
Update: Added the following code demonstration to clarify what I mean:
suppose I don't want the constructor to be directly modified from outside the package namespace of a class, so I return a reference to a closure from the constructor which can be indirectly accessed via an instance method of the class.
#Closured.pm
#!/usr/local/bin/perl -cw
use strict;
use warnings;
package Closured;
sub new{
our $self;
my $closure = sub {
shift;
if(@_){
$self = shift;
}
return $self;
};
bless $closure;
return $closure; #returning a codeRef instead
}
sub name{
&{$_[0]};
}
1;
#using the Closured class...
use strict;
use warnings;
use Closured;
my $object = Closured->new("Hisham"); #try to feed a constructor direc
+tly.
print $object,$/; #the constructor retruns a code ref.
print $object->name("BioHisham"), "\n"; #Feed via an instance method
#Output
Closured=CODE(0x18449ac)
BioHisham
Excellence is an Endeavor of Persistence.
Chance Favors a Prepared Mind.
|