#!/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"; #### #!/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(){$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_char)/; print "$char\n";