A very nice post. Learned something, thanks!

Matt

--- Michael Lamertz <[EMAIL PROTECTED]> wrote:
> On Wed, Feb 06, 2002 at 03:05:29PM +0100, Jorge Goncalvez wrote:
> >  I tried this:
> >   @Symlink=("$program_path\\install.lnk",
> >                      "$program_path\\linux.ram.lnk",
> >                      "$program_path\\alize\\install.lnk",
> >                      "$program_path\\alize\\startup.txt.lnk");
> > 
> >   foreach (@Symlink)
> >   {
> >             if (-e $_)
> >             {
> > 
> >                     system "rm $_";
> > 
> >             }
> >    }
> >    
> >   but it seems not to work?Why?
> 
> Looking at the '\\' in your filenames suggests that you're running
> Windows?  The 'rm' program is a Unix program and although there are
> versions for Windows too - using Cygwin e.g. - you most probably just
> don't have 'rm'.
> 
> Look here:
>     ---------- snip ----------
>     kanku-dai:~$ perldoc -f unlink
>            unlink LIST
>            unlink  Deletes a list of files.  Returns the number of
>                    files successfully deleted.
> 
>     ...
>            If LIST is omitted, uses $_.
>     ---------- snip ----------
> 
> The perl builtin 'unlink' does what 'rm' does, but from within perl, so
> you don't need to rely on "external" software.
> 
> Handily, it accepts lists, so given your above example you can remove
> your 'foreach' with
> 
>     unlink @Symlink;
> 
> BUT WARNING:  The checks are still missing.
> 
> That's no real problem since 'unlink' simply ignores the missing files,
> but here's how you could do them anyways:
> 
>     a.)
>         unlink grep { -e $_ } @Symlink;
> 
>     b.)
>         -e $_ && unlink foreach (@Symlink);
>     
> Check the documentation for grep (perldoc -f grep) to learn more about
> that.  Basically grep gets a piece of code and a list.  It runs the code
> for each element in the list and returns as result a new list that
> contains all elements that let the passed code return a 'true' value.
> 
> You could do the same like this:
>     my @newlist;
>     foreach (@Symlink) {
>         if (-e $_) {
>             push @newlist, $_
>         }
>     }
>     unlink @newlist;
> 
> 
> b. looks a bit more cryptic but I think still explainable:  We use 2
> programming idioms here: shortcut evaluation and modifiers.
> 
> First, lets talk about the modifiers:
> 
>     ---------- snip from 'perldoc perlsyn' ----------
>            Simple statements
> 
>     ...
> 
>            Any simple statement may optionally be followed by a SIN-
>            GLE modifier, just before the terminating semicolon (or
>            block ending).  The possible modifiers are:
> 
>                if EXPR
>                unless EXPR
>                while EXPR
>                until EXPR
>                foreach EXPR
>     ---------- snip ----------
> 
> What this short sentence implies is that you can add a clause to any
> simple expression.
> 
>     if (-e $my_file) {
>         unlink $my_file;
>     }
> 
> is equivalent to
> 
>     unlink $my_file
>         if -e $my_file;
>         
> Same goes for the 'foreach' loop:
> 
>     foreach (@Symlink) {
>         unlink
>     }
> 
> could also be written
> 
>     unlink
>         foreach @Symlink;
> 
> Above statement already does the job, but we wanted to include the test
> for existence of the file, which brings us to shortcuts:
> 
> Shortcut evaluation is the simple concept of bailing out of the
> condition as soon as it cannot any longer be true.
> 
> A '&&' test is only true if both sides of it are true.  So if the left
> side of the '&&' fails there's no need to look at the right side, so the
> whole expression fails immediately.
> 
> Since functions like 'unlink' return a value, we can use them as part of
> that '&&' statement, which brings us back to our example:
> 
>     -e $_ && unlink
> 
> If the file doesn't exist, perl skips the left half of the '&&' so the
> 'unlink' is never called for non-existant files.
> 
> Now we have a working expression that we can round up with our
> 'modifier' foreach
> 
>     -e $_ && unlink
>         foreach (@Symlink)
> 
> Voila.
> 
> -- 
>                      If we fail, we will lose the war.
> 
> Michael Lamertz        |                                      [EMAIL PROTECTED]
>     Nordstr. 49        |     http://www.lamertz.net - http://www.perl-ronin.de
>     50733 Cologne      |                               Priv:    +49 221 445420
>     Germany            |                             Mobile:  +49 171 6900 310
> 
> -- 
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 


__________________________________________________
Do You Yahoo!?
Send FREE Valentine eCards with Yahoo! Greetings!
http://greetings.yahoo.com

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to