Elive
view release on metacpan or search on metacpan
lib/Elive/Util.pm view on Meta::CPAN
{$1$2}x;
#
# reduce -0 => 0
$i = 0 if ($i eq '-0');
#
# sanity check.
#
die "bad integer: $_[0]"
unless $i =~ m{^[+-]?\d+$};
return $i;
}
=head2 prompt
my $password = Elive::Util::prompt('Password: ', password => 1)
Prompt for user input
=cut
sub prompt {
my ($prompt,%opt) = @_;
chomp($prompt ||= 'input:');
ReadMode $opt{password}? 2: 1; # Turn off controls keys
my $input;
my $n = 0;
do {
die "giving up on input of $prompt" if ++$n > 100;
print $prompt if IO::Interactive::is_interactive();
$input = ReadLine(0);
return
unless (defined $input);
chomp($input);
} until (defined($input) && length($input));
ReadMode 0; # Reset tty mode before exiting
return $input;
}
sub _reftype {
return Scalar::Util::reftype( shift() ) || '';
}
sub _clone {
return Clone::clone(shift);
}
sub _tainted {
return grep { Scalar::Util::tainted($_) } @_;
}
#
# Hex encoding/decoding. Use for data streaming. E.g. upload & download
# of preload data.
#
sub _hex_decode {
my $data = shift;
return
unless defined $data;
$data = '0'.$data
unless length($data) % 2 == 0;
my ($non_hex_char) = ($data =~ m{([^0-9a-f])}ix);
die "non hex character in data: ".$non_hex_char
if (defined $non_hex_char);
#
# Works for simple ascii
$data =~ s{(..)}{chr(hex($1))}gex;
return $data;
}
sub _hex_encode {
my $data = shift;
$data =~ s{(.)}{sprintf("%02x", ord($1))}gesx;
return $data;
}
=head2 string
print Elive::Util::string($myscalar);
print Elive::Util::string($myobj);
print Elive::Util::string($myref, $datatype);
Return a string for an object. This method is widely used for casting
objects to ids.
=over 4
=item
If it's a simple scalar, just pass the value back.
=item
If it's an object use the C<stringify> method.
=item
If it's a reference, resolve datatype to a class, and use its
C<stringify> method.
=back
=cut
sub string {
( run in 0.386 second using v1.01-cache-2.11-cpan-e93a5daba3e )