#!/usr/bin/env perl use v5.34; use warnings; use feature 'signatures'; no warnings ('experimental::signatures'); use Getopt::Std (); use URI::Escape (); sub usage($fh) { print $fh <<~'EOF'; Usage: uri [-e|-d] [CONTENT...] uri -h EOF } sub help($fh) { print $fh <<~'EOF'; Options: -e encode the string (the default action) -d decode the string -h, --help show this message CONTENT a literal string to be escaped Convert data to/from URL encoding. If CONTENT is not given, get data from STDIN. Examples: Encode the URL: $ echo "https://euandre.org/?q=$(uri 'a param')" https://euandre.org/?q=a%20param Decode the content from the file: $ uri -d < file EOF } for (@ARGV) { last if $_ eq '--'; if ($_ eq '--help') { usage *STDOUT; help *STDOUT; exit; } } my %opts; if (!Getopt::Std::getopts('edh', \%opts)) { usage *STDERR; exit 2; } if ($opts{h}) { usage *STDOUT; help *STDOUT; exit; } elsif ($opts{e} and $opts{d}) { say STDERR 'Both -e and -d given. Pick one.'; say STDERR ''; usage *STDERR; exit 2; } my $fn = $opts{d} ? \&URI::Escape::uri_unescape : \&URI::Escape::uri_escape; for (@ARGV ? @ARGV : ) { say &$fn($_); }