#!perl
our
$VERSION
=
'0.05'
;
Getopt::Long::Configure(
qw(bundling no_ignore_case)
);
my
$UUID
=
qr/^\s*(?i:urn:uuid:)?
([0-9A-Fa-f]{8}(?:-?[0-9A-Fa-f]{4}){4}[0-9A-Fa-f]{8})\s*$/
x;
my
$B64
=
qr/^\s*([A-Pa-p][0-9A-Za-z_-]{21})\s*$/
;
my
$B32
=
qr/^\s*([A-Pa-p][2-7A-Za-z]{25})\s*$/
;
my
$ALL
=
qr/$UUID|$B64|$B32/
;
my
%p
= (
input
=> [],
version
=> 1,
noalign
=> 0,
);
Getopt::Long::GetOptions(
'i|input=s'
=>
$p
{input},
'r|reverse'
=> \
$p
{
reverse
},
'n|nocase|nc|32'
=> \
$p
{nc},
'u|urn'
=> \
$p
{urn},
'v|version=i'
=> \
$p
{version},
'noalign'
=> \
$p
{noalign},
'h|help'
=> \
$p
{help},
);
if
(
$p
{help}) {
exit
Pod::Usage::pod2usage(0);
}
my
@input
;
if
(@{
$p
{input}}) {
for
my
$file
(@{
$p
{input}}) {
open
my
$fh
,
$file
or Carp::croak(
"$0: Could not read input $file: $!"
);
while
(
my
$line
= <
$fh
>) {
chomp
$line
;
unless
(
$line
=~
$ALL
) {
print
STDERR
"$0: Don't know what to do with $line\n"
;
next
;
}
push
@input
,
$line
;
}
}
}
elsif
(
@ARGV
) {
for
my
$x
(
@ARGV
) {
unless
(
$x
=~
$ALL
) {
print
STDERR
"$0: Don't know what to do with $x\n"
;
next
;
}
push
@input
,
$x
;
}
}
else
{
push
@input
,
lc
UUID::Tiny::create_uuid_as_string(
&UUID::Tiny::UUID_V4
);
}
my
%param
= (
radix
=>
$p
{nc} ? 32 : 64,
version
=>
int
!!
$p
{version},
align
=> !
$p
{noalign},
);
for
my
$in
(
@input
) {
if
(
my
(
$x
) = (
$in
=~
$UUID
)) {
print
$p
{
reverse
} ?
"$x\n"
:
Data::UUID::NCName::to_ncname(
$x
,
%param
) .
"\n"
;
}
elsif
((
$x
) = (
$in
=~
$B64
)) {
$x
= Data::UUID::NCName::from_ncname(
$x
,
%param
);
print
$p
{nc} && !
$p
{
reverse
} ?
Data::UUID::NCName::to_ncname(
$x
,
%param
) .
"\n"
:
"$x\n"
;
}
elsif
((
$x
) = (
$in
=~
$B32
)) {
$x
= Data::UUID::NCName::from_ncname(
$x
,
%param
);
print
$p
{
reverse
} ?
"$x\n"
:
Data::UUID::NCName::to_ncname(
$x
,
%param
) .
"\n"
;
}
}