For instance I'm aware of easy piping with | and redirection >
IPC::Run perhaps? From its synopsis:
run \@cat, '<', "in.txt", '>>', "out.txt", '2>>', "err.txt";
run \@cat, '|', \@gzip;
with less and ls implemented as subs (see also Shell)
Excuse the plug, but I wrote a module that presents a similar interface, but it has more error handling, less problems with shell quoting, and additional capabilities: IPC::Run3::Shell.
There are also several modules I've found very useful in writing shorter code, such as Path::Class and File::Find::Rule.
what are the fundamental obstacles hindering Perl to be used instead of Bash and or PowerShell?
I imagine one issue that might come up is variable scoping, i.e. how long do variables last once they're created - I imagine in a long-running shell, this might end up being a bit of a memory leak.