Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re^4: List EXE_FILES installed by CPAN

by usemodperl (Beadle)
on Jun 24, 2018 at 08:45 UTC ( [id://1217315]=note: print w/replies, xml ) Need Help??


in reply to Re^3: List EXE_FILES installed by CPAN
in thread List EXE_FILES installed by CPAN

EDIT: This code is wrong, see OP for correct version! Sorry...

It's much easier to develop one-liners on the command line because it can so rapidly scroll through history of revisions. I can get a few test runs deep into trouble fiddling around with it and get back to a working version by hitting the up arrow a few times. In many years I haven't found a more rapid, easier and fun way to explore and deploy the power of perl. After achieving my desire from the machine these mega one liners find themselves all sorts of places to extend the operating system with new commands and functions.

The way I'm posting them, dense and without triggering code wrap, makes it easy for me (and hopefully you) to copy directly from the webpage, to paste in a console. So you click download and see this gigantic one-liner that you want as a script? It depends on your operating system but for this script on Linux/Mac it goes something like this:

Control|Command + a to select all
Control|Command + c to copy selected text
In a terminal type: echo
Type one space
Control|Command + p to paste text
Type: | perltidy -st >cpanexe; nano cpanexe

Here's a handy blob of code to throw at a terminal that transforms itself into a proper script, saved to disk, opened in an editor. This can make any one liner into a script! Just echo a pasted one-liner to another one-liner via pipe and then pipe that to perltidy which you can direct to save a file and then open it in your favorite text editor:

echo perl -le'chomp(@_=`perldoc -T perllocal`); # List EXE_FILES installed by CPAN $_=join"\n",@_;@_=split/\"Module\"\s/; @_=grep/EXE_FILES:\s[^"]+/,@_;for(@_){@x=split/\n/; @x=grep/EXE|0m/,@x;push@z,@x}s/^\s+\*\s+\"([^\"]+).?/$1/ for@z; @_=grep/EXE_FILES/,@z;@_=map{substr($_,11,length($_))}@_;undef@z; for(@_){if(/\s/){@x=split/\s/;push@z,$_ for@x}else{push@z,$_}} %_=map{s/^\S+\///;$_=>1}@z;print$_ for sort{lc($a)cmp lc($b)}keys%_'| perl -e'@_=<STDIN>;print qq~\#\!/usr/bin/perl\n\nuse strict;~.qq~ use warnings;\n\n@_;~'|perltidy -st >cpanexe;nano cpanexe
Result:

#!/usr/bin/perl -w use strict; use warnings; chomp( @_ = `perldoc -T perllocal` ); # List EXE_FILES installed by CPAN $_ = join "\n", @_; @_ = split /\"Module\"\s/; @_ = grep /EXE_FILES:\s[^"]+/, @_; for (@_) { @x = split /\n/; @x = grep /EXE|0m/, @x; push @z, @x; } s/^\s+\*\s+\"([^\"]+).?/$1/ for @z; @_ = grep /EXE_FILES/, @z; @_ = map { substr( $_, 11, length($_) ) } @_; undef @z; for (@_) { if (/\s/) { @x = split /\s/; push @z, $_ for @x } else { push @z, $_ } } %_ = map { s/^\S+\///; $_ => 1 } @z; print $_ for sort { lc($a) cmp lc($b) } keys %_;
I don't see the problem with dense code. It makes sense to me because that's how it gets created at the command line. Perlmonks understand it just as well as their spoken language so i don't understand the criticism or why we're constantly hounded by the cult of whitespace. Learn how to use perltidy and the rest of your operating system to make it do what you want instead of complaining. It's much more productive! ☺

This is a one-liner! A tidy 20 lines. It gets 29 things done with perl to do something impossible:


chomp join split grep for split grep push s for 
grep map substr length undef for if split push 
for else push map s print for sort cmp keys



STOP REINVENTING WHEELS, START BUILDING SPACE ROCKETS!CPAN 🐪

Replies are listed 'Best First'.
Re^5: List EXE_FILES installed by CPAN
by stevieb (Canon) on Jun 25, 2018 at 16:23 UTC
    "It's much easier to develop one-liners on the command line because it can so rapidly scroll through history of revisions."

    That's what a VCS (Version Control System) is for (eg: Git, SVN, Mercurial etc). The added benefit is being able to much more easily read your code (because it's in a script), and it provides permanent revision bouncing (and commit cherry-picking, tagging etc).

      I develop Perl with Komodo which uses PerlTidy to check syntax when typing each character and GitHub Desktop to admire the evolution of large brojects (cause i like that typo). But when I develop ideas at the speed of thought none of that otherwise wonderful stuff can keep up with me and the up arrow. Once 1 line grows to 3 or 5 and it finally works then I can:
      echo perl -le 'print"JaPH"'| perl -e '$_=<STDIN>;s/perl\s\-?[a-zA-Z]*\s*\W//s; print qq~\#\!/usr/bin/perl\n\nuse strict;\nuse warnings;\n\n$_;~'| perltidy -st > script; nano script
      perl -MO=Deparse -e 'I T T M W O D T I'
      STOP REINVENTING WHEELS, START BUILDING SPACE ROCKETS!CPAN 🐪
Re^5: List EXE_FILES installed by CPAN
by Anonymous Monk on Jun 24, 2018 at 12:41 UTC
    It gets 29 things done with perl to do something impossible
    It's not impossible. You should look up what that word means.
    It's much easier to develop one-liners on the command line because it can so rapidly scroll through history of revisions. I can get a few test runs deep into trouble fiddling around with it and get back to a working version by hitting the up arrow a few times. In many years I haven't found a more rapid, easier and fun way to explore and deploy the power of perl.
    For you maybe, it sounds stupid and time consuming, and looks awful. Thanks for perpetuating the meme that perl looks like line noise
      It's not impossible. You should look up what that word means.

      AFAIK it was not possible on my computer to get a simple sorted list of executables installed in path by CPAN without writing something (like perldoc -uT perllocal |grep "EXE_FILES: [a-z]" |cut -c 14- |sed 's/>//' |sort). It is now possible to do that on my computer with perl and thanks to the generosity of perlmonks.org (and yours-truly ;) your computer can do this too, if you want it to! Hopefully I didn't reinvent some wheel but I could not find what I want like:
      
      cpanlist --exeonly --sortbyname --nopath --unique
      
      
      I'm still working on --showdesc and --showhelp like output, at the command line of course 💻

      For you maybe, it sounds stupid and time consuming, and looks awful. Thanks for perpetuating the meme that perl looks like line noise

      It's so much faster than dealing with scripts. The brevity of Perl represents one of the most intense achievements of information compression in the known universe! Perlmonks appreciate and celebrate that sort of thing, why don't you? Funny pictures with your-text-here notwithstanding... ☺

      STOP REINVENTING WHEELS, START BUILDING SPACE ROCKETS!CPAN 🐪

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1217315]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others having an uproarious good time at the Monastery: (2)
As of 2024-04-20 15:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found