From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10313 invoked from network); 3 Sep 1999 08:55:47 -0000 Received: from sunsite.auc.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 3 Sep 1999 08:55:47 -0000 Received: (qmail 29671 invoked by alias); 3 Sep 1999 08:55:29 -0000 Mailing-List: contact zsh-users-help@sunsite.auc.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 2560 Received: (qmail 29664 invoked from network); 3 Sep 1999 08:55:29 -0000 Message-Id: <199909030855.KAA163997@hydra.ifh.de> X-Authentication-Warning: hydra.ifh.de: pws owned process doing -bs To: zsh-users@sunsite.auc.dk Subject: Re: strange glob expansion In-reply-to: ""Bart Schaefer""'s message of "Fri, 03 Sep 1999 04:34:51 -0000." <990903043451.ZM25090@candle.brasslantern.com> Date: Fri, 03 Sep 1999 10:55:26 +0200 From: Peter Stephenson "Bart Schaefer" wrote: > Peter's latest patches to 3.1.6 (zsh-workers 7611 and 7624) cause zsh to > complain: > > zagzig<8> echo L(*/)# > zsh: bad pattern: L(*/)# > > Zsh is being very clever here, as it's only a bad pattern in file-globbing > context, not in string matching context: > > zagzig<9> [[ Lazy//lob/ == L(*/)# ]] && echo ok > ok It occurs to me (finally) that maybe this is the best behaviour, since it actually lets you know that /'s don't work in parentheses for files. The documented behaviour (works up to 3.1.6) is that the / is ignored and parsing continues after the parentheses, but I guess that was simply to note what was actually happening rather than an endorsement of it (and the example with the z shows it was rather flakey). I have no plans to make /'s work in groups --- that would require large changes to both the pattern code and the file scanning code in glob.c --- so if there is no objection I'll just change the documentation for the new pattern matching code to recognise the behaviour noted by Bart. > } The upshot of this is that to match all Perl modules starting with `L' > } below the cwd, I have to use L{*/**/*,}.pm instead of L**/*.pm. > > What? L{*/**/*,}.pm is first brace-expanded to L*/**/*.pm and L.pm, and > then globbed. There probably isn't an L.pm, so that matches in any sub- > directory whose name starts with L and all its subdirectories, all the > files whose names end with .pm. You could have done that without the > braces, with L*/**/*.pm, but I suspect what you meant was */**/L*.pm. I think the answer is **/L*.pm --- as remarked by someone a day or two ago, **/ can match (very usefully, but slightly counterintuitively given the /) in the current directory too. For example, in /usr/local/lib/perl5 `ls **/A*.pm' gives me: AnyDBM_File.pm AutoLoader.pm AutoSplit.pm Text/Abbrev.pm -- Peter Stephenson Tel: +39 050 844536 WWW: http://www.ifh.de/~pws/ Dipartimento di Fisica, Via Buonarroti 2, 56127 Pisa, Italy