use 5.006;
use strict;
=head1 NAME
Getopt::Lazier - Lazy Getopt-like command-line options and argument parser
=head1 VERSION
Version 0.06
=cut
our $VERSION = '0.06';
=head1 SYNOPSIS
my ($opt, @DARG) = Getopt::Lazier->new(@ARGV);
=head2 EXAMPLE USAGE
Lazy:
use Getopt::Lazier;
my ($opt, @DARG) = Getopt::Lazier->new(@ARGV);
use Data::Dumper; print Dumper([$opt, \@DARG])."\n";
# perl lazyscript.pl -help a b c d --meow=5345923 -awoo="doggo vibes" -- --this-aint-no-option
$VAR1 = [
{
'awoo' => 'doggo vibes',
'meow' => '5345923',
'help' => 1
},
[
'a',
'b',
'c',
'd',
'--this-aint-no-option'
]
];
Lazier:
use Getopt::Lazier;
my $opt = Getopt::Lazier->new();
use Data::Dumper; print Dumper([$opt, \@ARGV])."\n";
# perl lazierscript.pl -o -p ok
$VAR1 = [
{
'o' => 1,
'p' => 1
},
[
'ok'
]
];
More Lazier:
use Getopt::Lazier "ovar";
use Data::Dumper; print Dumper([{%ovar}, $ovar, \@ARGV])."\n";
# perl t.pl --opt1=val arg --opt2 arg2
$VAR1 = [
{
'opt1' => 'val',
'opt2' => 1
},
{
'opt1' => 'val',
'opt2' => 1
},
[
'arg',
'arg2'
]
];
=cut
=head1 SUBROUTINES/METHODS
=head2 new
The laziest way to parse arguments tho.
Returns a hashref of parsed options, and (if called in list context) an array of remaining arguments.
C<new> takes a list/array as an argument, and if unspecified will use @ARGV by default.
=head2 import
Now with namespace fuckery! Passing a string to the C<use> pragma will make the import method
run C<new> automatically on C<@ARGV> and import the string as variable names in package C<main>.
For example:
use Getopt::Lazier "options";
Will import both C<%options> (a hash of the parsed options), and (for backwards compatability) C<$options> (a
reference to the hash). If the script was passed C<--help> on the command line, both C<$options{help}> and C<$options-E<gt>{help}>
would be set to C<1>.
=cut
sub import {
my ($exporter, $fuckery) = @_;
if ($fuckery) {
my $opt = new();
no strict 'refs'; # so naughty!
# Create hash in main.
*{"main::$fuckery"} = \%$opt;
# Create hashref in main (for backwards compatability)
*{"main::$fuckery"} = \\%{"main::$fuckery"};
}
}
sub new { # DNM: I <3 this function.
my $self = shift;
my @ARGA = scalar(@_) ? @_ : @main::ARGV;
my $opt = {};
my @DARG;
my $var = uc(basename($0));
my $cont = 1;
unshift(@ARGA, split(/\s+/, $ENV{$var})) if ($ENV{$var});
foreach my $ar (@ARGA) {
if ($cont && $ar eq '--') {
$cont = 0;
} elsif ($cont && $ar =~ m/^--?(.*?)[=|:](.*)/) {
${$opt}{$1} = $2;
} elsif ($cont && $ar =~ m/^--?(.*)$/) {
${$opt}{$1} = 1;
} else {
push @DARG, $ar;
}
}
return ($opt, @DARG) if wantarray;
@main::ARGV = @DARG;
return($opt);
}
=head1 AUTHOR
Jojess Fournier, C<< <jojessf@cpan.org> >>, Dave Maez
=head1 BUGS
Please report any bugs or feature requests to C<bug-getopt-lazier at rt.cpan.org>, or through
the web interface at L<https://rt.cpan.org/NoAuth/ReportBug.html?Queue=Getopt-Lazier>. I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.
=head1 SUPPORT
You can find documentation for this module with the perldoc command.
perldoc Getopt::Lazier
You can also look for information at:
=over 4
=item * RT: CPAN's request tracker (report bugs here)
=item * CPAN Ratings
=item * Search CPAN
=back
=head1 ACKNOWLEDGEMENTS
Thanks to Dave for the ENV addition. Also for being awesome. :3
=cut
=head1 LICENSE AND COPYRIGHT
This software is Copyright (c) 2024 by Jojess Fournier.
This is free software, licensed under:
GNU GENERAL PUBLIC LICENSE 3.0
=cut
1; # End of Getopt::Lazier