From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 652 invoked from network); 13 Dec 2000 17:06:02 -0000 Received: from sunsite.dk (HELO sunsite.auc.dk) (130.225.51.30) by ns1.primenet.com.au with SMTP; 13 Dec 2000 17:06:02 -0000 Received: (qmail 10436 invoked by alias); 13 Dec 2000 17:05:47 -0000 Mailing-List: contact zsh-users-help@sunsite.auc.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 3565 Received: (qmail 10429 invoked from network); 13 Dec 2000 17:05:46 -0000 Date: Wed, 13 Dec 2000 10:05:38 -0700 From: Steve Talley To: Bart Schaefer Cc: zsh-users@sunsite.auc.dk Subject: Re: Anonymous array indexing Message-ID: <20001213100537.P11810@rmtc> References: <20001212184156.I11810@rmtc> <1001213040610.ZM11053@candle.brasslantern.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <1001213040610.ZM11053@candle.brasslantern.com>; from schaefer@candle.brasslantern.com on Wed, Dec 13, 2000 at 04:06:10AM +0000 Thanks Bart/Dan for the replies! This _almost_ solves my problem, although I think I oversimplified. The actual usage of this is in: # Find a value for TERMINFO by looking for xterm package delegates=(5.9 5.8.1 5.8 5.7 5.6) terminfo=( $HOME/$^delegates/pkgs/xterm/lib/terminfo(/) ) export TERMINFO=$terminfo[1] unset terminfo Unfortunately this doesn't work well with your solution, ie. export TERMINFO=${${=:-$HOME/$^delegates/pkgs/xterm/lib/terminfo(/)}[2]} doesn't even come close to working. Any ideas for this slightly more complicated example? Thanks, Steve Bart Schaefer wrote: > On Dec 12, 6:41pm, Steve Talley wrote: > } > } Is there a compact version of the following: > } > } fred=(one two three) > } export FRED=$fred[2] > } unset fred > } > } so that I can avoid having to use the temporary variable fred. > > The general trick is that the nameless parameter ${} always expands to the > empty string, so ${:-value} always expands to "value". Then build up from > there. > > } I am looking for something like > } > } export FRED=(one two three)[2] > > The value in ${:-value} always starts out as a scalar (a string), so you > have to explicitly convert to an array before you can index it. > > If the individual words of the array do not contain spaces, you can combine > word splitting ${=scalar} with ${:-value} to get: > > export FRED=${${=:-one two three}[2]} > > If the words will have embedded spaces, you'll have to resort to some other > kind of splitting. E.g., ${(f)...} splits at newlines, so you can do: > > export FRED=${${(f):-$'one\ntwo has spaces\nthree'}[2]} > > This uses $'...' to turn \n into newlines, then splits on them. However, > the $'...' syntax is not available in 3.0.x. In all versions you can > instead split on some other character, e.g. on period: > > export FRED=${${(s(.)):-one.two has spaces.three}[2]} > > I don't think there is a fully general solution that works when you can't > choose in advance a character on which to split. However, I'm guessing > that the strings in the array are known in advance, and that it is the > subscript that might vary, so you should be able to work something out. > > -- > Bart Schaefer Brass Lantern Enterprises > http://www.well.com/user/barts http://www.brasslantern.com > > Zsh: http://www.zsh.org | PHPerl Project: http://phperl.sourceforge.net