bsb,
This requires the string to be stored in the lexical $string, but you were looking for something perverse:
#!/usr/bin/perl
use strict;
use warnings;
package Random_Char;
use PadWalker 'peek_my';
sub TIESCALAR { bless {}, $_[0] }
sub STORE { return 1 }
sub FETCH {my @c=keys%{{map{$_=>undef}split//,${peek_my(1)->{'$string'
+}}}};return $c[rand @c];}
package main;
tie my $rand_char, "Random_Char";
my $string = 'One bright day in the middle of the night';
my ($char) = $string =~ /($rand_char)/;
print "$char\n";
Cheers - L~R
Update:
Here is another that is a bit more fragile that doesn't use modules.
It works on the form ($char) =~ "some string" =~ /($rand_char)/;
#!/usr/bin/perl
use strict;
use warnings;
package Random_Char;
sub TIESCALAR { bless {}, $_[0] }
sub STORE { return 1 }
sub FETCH {open(I,$0);my $l;while(<I>){$l=$_ and last if$.==(caller)[2
+]}
$l =~ s/^.*=\s*(["'])(.*)\1\s*=~.*$/$2/;my @c=keys%{{
map{$_=>undef}split//,$l}};return $c[rand @c];
}
package main;
tie my $rand_char, "Random_Char";
my ($char) = 'One bright day in the middle of the night' =~ /($rand_ch
+ar)/;
print "$char\n";
|