A better way . . .

mikeraz at patch.com mikeraz at patch.com
Fri Dec 14 13:28:30 CST 2001

On another list someone said:

> I'm hacking on a script... and in that script, there's a list of
> services that looks like this:
>SERVICES="mysql postgresql bind9 jabber nfs-kernel-server nfs-user-server \
>  samba apache ssh ntp inetd exim sendmail"
>  I'm the type of pedantic individual who likes lists like that to be
>  sorted in alphabetical order, so here's what I did[1]:
> [all of his emacs buffer opening, and lisp example deleted]

And someone replied with:

> (From the start of the line in command mode)
> "adf"   <--- Delete until a " and stuff it into buffer a
> $"bx    <--- Go to the end of the line and delete the other ",
>              save in buffer b
> ".!perl -pe 'tr/ /\n/;' | sort | perl -pe 'tr/\n/ /;'
>         <--- sort the line using sort.
> ^"aP    <--- put the leading stuff back
> $"bp    <--- put the trailing stuff back
> Someone out there will know how to do this without deleting the leading
> and trailing stuff with a mark or something.

To which I replied:

Why yes, someone would:

:.!perl -ne '(@i)=split /\"/; (@w)=split / /, $i[1]; print "$i[0]\"", (join " ", sort @w), "\"";' 

:.!           # send current line to 
perl -ne '    #perl treating the following string as the contents of a while(<>){ ... } loop
(@i)=split /\"/;       # cut the line up based on quotes
(@w)=split / /, $i[1]; # cut the stuff up between the quotes based on spaces
print "$i[0]\"",       # print the begining of the line and the opening quote
(join " ", sort @w),   # and the sorted space reinserted data
 "\"";'                # and the closing quote

So Real Perl People, what is a better way to do this?

[Disclaimer, the first time I did this I left out the join ...] but that's what 'u' is for in vi.]

And as a follow up I attempted to (vi'ism here) visually select the text to sort and then

:'<,'>!perl -ne '(@w)=split; print join " ", sort @w;'

Which would cause:
  SERVICES="mysql postgresql bind9 jabber nfs-kernel-server nfs-user-server samba apache ssh ntp inetd exim sendmail"  

to become:
  SERVICES="mysql apache bind9 exim inetd jabber nfs-kernel-server nfs-user-server ntp postgresql samba sendmail" ssh 

What?  The first element isn't sorted and (the huge puzzler) the last
element is somehow transmuted to outside the " marks, which is outside the
selected range.  ???  And yes, I repeated the operation while making sure
the " was not part of the range.  I'm assuming that vi is (somehow/why)
including the full non-white space region to the end.

And insight to what's going on with this?

    Michael Rasmussen  aka  mikeraz
   Be appropriate && Follow your curiosity
   "They that give up essential liberty to obtain
   temporary safety, deserve neither liberty nor safety."
				-- Benjamin Franklin 	
     But keep in mind:
I call them as I see them.  If I can't see them, I make them up.
		-- Biff Barf

More information about the Pdx-pm-list mailing list