|
|||||||||||||||||||||||||||
Igen, tak for hjælpen. FYI er her mine erfaringer.
ActivePerl stiller nogle pakker til rådighed, som skal råde lidt bod på
den mangelfulde 'shell', som følger med Mircrosoft OSer. Jeg benyttede
File::Listing
til at indføre mine regular expressions, og
File::DosGlob
til at benytte DOS wildcarding.
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?
Glob følger som sagt med i 3 version
perlglob.bat
perlglob.exe
File::DosGlob
Alle tre lider af den skavank, at de virkelig emulerer DOS :-(
Ulempen er, at
ls *j?
som output kan give
jk-j
jk-jk
Samme resultat fås, når DIR anvendes i CommandPrompt,
og når ls anvendes i Cygwin's Bash. På Un*x får man selvfølgelig
kun den sidste.
Endvidere kan taint ikke anvendes i DosGlob!
>
> > 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 ]).
>
Jeg kan på enkel vis indføre wildcards '*' og '?' v.hj.a.
for ($j=0; $j < scalar @ARGV; $j++)
{
my $re;
$_ = $ARGV[$j];
s/\./\\./g;
s/\*/\.\*/g;
s/\?/\./g;
$re = $_ . "\$";
...
} # for j
Dette giver i min lege-test-emulering af ls det samme output som på Un*x.
Det er lige det, jeg skal bruge.
>
> /Ole
mvh
Jan
|
||||||||||||||
|
||||||||||||||