|
|||||||||||||||||||||||||||
Der spindes lige en ende mere:
Når jeg ønsker at have adgang til filer i directory strukturen og ikke
kun current directory så virker simpel regexp ikke, så Ole har ret i,
at jeg _ikke_ absolut _vil_ bruge regexp.
Jeg finder det mest formålstjenligt at benytte File::DosGlob, idet
den tillader backslash (såvel som slash).
For eventuelle interesserede indsætter jeg kode og output.
glb1 benytter File::DosGlob, og glb2 benytter eval.
Kun glb1 tillader backslash.
Wildcard '?' betyder i DOS åbenbart det samme som '*'.
_____________________________
#!perl -w
use File::DosGlob 'glob';
# main()
{
glb1();
glb2();
} # main
sub glb1()
{
print "glb1\n";
if ( 0 == scalar @ARGV ) { push @ARGV,"*"; }
for ( $j=0; $j < scalar @ARGV; $j++ )
{
@files = glob "$ARGV[$j]";
for ( sort @files ) { print "$_\n"; }
} # for j
} # glb1
sub glb2()
{
print "glb2\n";
if ( 0 == scalar @ARGV ) { push @ARGV,"*"; }
@e = @ARGV; @ARGV = ();
for (@e) { push(@ARGV,<eval $_>); }
for ( @ARGV ) { print "$_\n"; }
} # glb2
>tPerl\wildcard\glb.pl */w*/*j? *\w*/?l?.pl
glb1
tPerl/wildcard/jk-j
tPerl/wildcard/jk-jk
tPerl\wildcard/glb.pl
tPerl\wildcard/ls.pl
glb2
tPerl/wildcard/jk-j
tPerl/wildcard/jk-jk
_____________________________
mvh
Jan
Ole Tange wrote:
> On Wed, 17 May 2000, Jan Eggert Kofoed wrote:
>
> > Jeg har er ved at lave Perl programmer, som skal filtrere filer, og
> > dette
> > skulle gerne kunne lade sig gøre ved at benytte wild cards på samme
> > måde som en shell gør det. Jeg ville gerne undgå at stole på shellen,
> > for nogle af mine brugere har benytter ikke bash på Windows platformen.
>
> Da jeg skulle skrive noget perl til Windows fulgte der et program
> med i perl-pakken: glob.exe. Gør der stadig det?
>
> > Jeg kan godt få fat på filnavne (parse_dir). Hvordan checker jeg, om
> > filnavnet
> > opfylder regexp angivet ved wild card? For eksempel ville jeg godt kunne
> >
> > skrive noget i retning af
> > perl -TSw jk.pl "*2*.pl"
>
> Hvis du bruger glob.exe, kan du som første linje skrive:
>
> @ARGV=<eval $ARGV[0]>;
>
> Dette vil evaluere det første argument på kommandolinjen og derefter
> benytte csh eller glob.exe til at expande, slutteligt putte resultatet ind
> i @ARGV, så det for perl "ser ud som om" de stod på kommando linjen.
>
> Hvis du vil have lov at skrive:
>
> perl -TSw jk.pl "*2*.pl" abc.txt "ole?????.pl" ...
>
> skal du ud i noget ala:
>
> @sslug@sslug; @ARGV=();
> for(@e) { push(@ARGV,<eval $_>); }
>
> Hvis glob.exe ikke længere findes til Windows, så prøv lige at checke CPAN
> om de ikke har en globbing-ting.
>
> Hvis du absolut _vil_ regexpe, så skal du konvertere alle globbings til
> regexps:
>
> ? = .
> {a,bc} = (a|bc)
> * = .*
> [a-f] = [a-f]
> tegn = \tegn
>
> Det overlades til en øvelse til læseren at få lavet en 100% korrekt
> implementation. Jeg lugter bøvl, når man skal finde ud af, om [ har en
> speciel betydning: [a-f] eller ingen speciel betydning: [a-f (uden ]).
>
> /Ole
|
||||||||||||||
|
||||||||||||||