damian has asked for the wisdom of the Perl Monks concerning the following question:

hi fella monks, i'm really a newbie in perl, and here's another problem. i'm developing a web-based program wherein i could delete and add files via web. now if i delete a file the script should modify another script, it should change the number of files in the current directory. for example: this is the script that should be modified:
open(FILE, $file) or die $!; @lines = <FILE>; close FILE; for ($i = 0; $i <= $#lines; $i++) { if ($lines[$i] =~ /<% INCLUDE exclusives(\d+)\.tmpl %>/) { $num = $1; $num = $num == 1 ? 3 : 1; $lines[$i] =~ s/<% INCLUDE exclusives(\d+)\.tmpl %>/<% INCLUDE ex +clusives$num\.tmpl %>/; } else { next; } open(FILE, ">$file") or die $!; print FILE @lines; close FILE;
as you can see the line:
$num = $num == 1 ? 3 : 1;
knows the number of files which in this case 3 files. now if i delete a file it should replace 3 to just 2. the same if i add a file 3 will turn into 4.... how will i be able to replace the value (3) whenever i delete or add a file via web. thanks in advance.

Replies are listed 'Best First'.
Re: replacing values via web
by le (Friar) on Jul 18, 2000 at 13:37 UTC
    A quick hack:
    opendir(INCLUDES, $includesdir) or die $!; @includefiles = grep (/exclusives\d+\.tmpl$/, readdir(INCLUDES)); closedir INCLUDES; $num_of_files = scalar @includefiles; # ... $num = $num == 1 ? $num_of_files : 1;
    This implies that the number in the filenames and the actual count of files go together. (E.g. you don't delete a file in the middle of the row.)
(jjhorner)replacing values via web
by jjhorner (Hermit) on Jul 18, 2000 at 16:10 UTC

    A quick revision of your current code:

    foreach my $thing (@lines) { if ($thing =~ /<% INCLUDE exclusives(\d+)\.tmpl %>/) { my $num = $1 == 1 ? 3 : 1; $thing =~ s/<% INCLUDE exclusives(\d+)\.tmpl %>/<% INCLUDE exclusives$ +num\.tmpl %>/; } }

    As mentioned above, you should get the number of files from the directory to prevent your code from getting too far away from reality.

    By the way, get in the habit of using '-w' on your hash-bang line and using the 'strict' pragma. If using Perl 5.6.0, use the 'warnings' pragma. They will save you a ton of debugging time.

    HTH

    UPDATE: An observant person below asked whether the $_ variable could be changed and the changes affect the @lines array, (I used $_ instead of $thing in my first version). I looked around in the Perl Cookbook (from my Perl CD Bookshelf), and noticed that they never used the $_ variable to do something with each element of an array, so I decided to change mine just to be safe. I'm pretty sure it will work, but I didn't want to assume too much.

    J. J. Horner
    Linux, Perl, Apache, Stronghold, Unix
    jhorner@knoxlug.org http://www.knoxlug.org/
    
      Just a dumb question:

      Will a substitution on $_ find its way into the array? (Will the array contents get changed when one changes $_?)
        Yes it will since the array element is an lvalue.

        From perlsyn:

        If any element of LIST is an lvalue, you can modify it by modifying VAR inside the loop. That's because the foreach loop index variable is an implicit alias for each item in the list that you're looping over.

        Nuance