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

I'm new to Perl and have been put in the position of being the only Perl programmer in a huge Perl shop, maintaining and writing lots of Perl code they need yesterday. This one has me stumped.

As the result of about 20 other perl scripts there are about 75 files in a directory. I match all the files ending in .htm into a hash, that works fine. I can print those to the screen just fine, but if I try and make a copy of each of the files in the hash I get into trouble, I can't make it work. I'm in a lot of trouble here and would appreciate any help at all I can get.

After I make the tmp files, my plan is to do a pattern search in each tmp file for a specific group of lines, put those lines into a hash, search the file for the key and put a link to the value that matches the key, copy the tmp file over the original file and remove the tmp file.

1 #!/pw/prod/svr4/perl/bin/perl -w 27 # ARGUMENTS: engine_figurelinks.pl xx_manual_vvv 28 # where xx = manual code, vvv = version 29 # 30 # MODIFICATIONS: 31 # 32 #------------------------------------------------------ 33 34 use warnings; 35 use diagnostics; 36 use Env qw(SERVER_NAME); 37 use CGI qw(:standard :netscape); 38 use File::Copy; 39 new CGI; 40 #------------------------------------------------------ 41 42 ($manualdir_param) = @ARGV; 43 $working_dir = $manualdir_param; 44 $working_dir =~ s/manualdir=//i; 45 46 $data_area = "/tmp"; 47 $html_dir = "$data_area/$working_dir"; 48 49 #------------------------------------------------------ 50 51 # Loop to locate HTML files and make working tmp copies 52 53 opendir( HTMLSTORIES, "$html_dir") || die "HTML files do not exis +t: $1"; 54 @FigureArray = grep{/\.htm$/} readdir ( HTMLSTORIES ); 55 foreach $figfile (@FigureArray) { 56 copy ($figfile, "$1.tmp") or die "Can not make temporary +copy of file: $1"; 57 } 58 59 closedir HTMLSTORIES; 60 #------------------------------------------------------

Replies are listed 'Best First'.
Re: Making tmp copies of files
by alienhuman (Pilgrim) on Feb 21, 2006 at 17:59 UTC

    I'm not 100% what you want your script to do, but I'm pretty sure that copy ($figfile, "$1.tmp") doesn't do what you want.

    In my quick-and-dirty version of your script (with paths for my localhost), copy ($figfile, "$1.tmp") copies "your_file.htm" to a file named ".tmp", instead of one named "your_file.htm.tmp". Is the latter what you want?

    Edit: I should probably explain why. $1 does the following (from perldoc.perl.org):

    The text matched by the used group most-recently closed (i.e. the group with the rightmost closing parenthesis) of the last successful search pattern.
    In your foreach block, $1 is undef. I'm not 100% sure why, so maybe some of the senior monks can answer that question.

    Also, I'll mention that you never chdir to $html_dir in your code, so your copy happens in whichever directory your script is running (which I'm guessing isn't where you keep your HTML files).

    Finally, it's helpful to include the error message that you're getting when you run your code.

    Here's your code, properly formatted with <code> tags. Also, those line numbers in your code aren't helpful here. Format your code and your questions better if you want quicker answers. The details are here: Writeup Formatting Tips.

    #!/pw/prod/svr4/perl/bin/perl -w # ARGUMENTS: engine_figurelinks.pl xx_manual_vvv # where xx = manual code, vvv = version # # MODIFICATIONS: # #------------------------------------------------------ use warnings; use diagnostics; use Env qw(SERVER_NAME); use CGI qw(:standard :netscape); use File::Copy; new CGI; #------------------------------------------------------ ($manualdir_param) = @ARGV; $working_dir = $manualdir_param; $working_dir =~ s/manualdir=//i; $data_area = "/tmp"; $html_dir = "$data_area/$working_dir"; #------------------------------------------------------ # Loop to locate HTML files and make working tmp copies opendir( HTMLSTORIES, "$html_dir") || die "HTML files do not exist: $1 +"; @FigureArray = grep{/\.htm$/} readdir ( HTMLSTORIES ); foreach $figfile (@FigureArray) { copy ($figfile, "$1.tmp") or die "Can not make temporary copy of f +ile: $1"; } closedir HTMLSTORIES;

    ----------
    Using perl 5.8.1-RC3 unless otherwise noted. Apache/1.3.33 (Darwin) unless otherwise noted. Mac OS X 10.3.9 unless otherwise noted.
      copy ("$html_dir/$figfile", "$html_dir/$figfile.tmp") or die "Can not make temporary copy of file: $1";
      You have no idea how much I appreciate your help. I
      made the suggested changes as you can see above, and
      get this error:

      Use of uninitialized value in concatenation (.) or
      string at ./engine_figurelinks.pl line 53 (#1)
      (W uninitialized) An undefined value was used as if it
      was a mistake. To suppress this warning assign a
      defined value to your variables.

      To help you figure out what was undefined, perl tells
      you what operation you used the dedefined value in.
      Note, however, that perl optimizes your progrm and the
      operation displayed in the warning may not necessarily
      appear literally in your program. For example, "that
      $foo" is usually optimized into "that" . $foo, and the
      warning will refer to the concatenation (.) operator,
      even though there is no . in your program.

      Uncaught exception from user code:
      HTML files do not exist: at ./engine_figurelinks.pl line 53
        This isn't going to work. $1 isn't defined as no capture has taken place.

        Try this.
        # For foo.htm => foo.htm.tmp opendir( HTMLSTORIES, "$html_dir") || die "HTML files do not exist: $! +"; @FigureArray = grep{/\.htm$/} readdir ( HTMLSTORIES ); foreach $figfile (@FigureArray) { copy ($figfile, "$figfile.tmp") or die "Can not make temporary cop +y of file [$figfile]: $!"; }
        BTW, make copies of the original before overwriting them. The last thing you want to do is blow them all away and realize you don't have backups.


        -Lee
        "To be civilized is to deny one's nature."
        This last problem turned out to be a system created
        problem. The files in /tmp are deleted on a time
        basis and all my files were gone. I just didn't
        realize it at first. IT WORKS!!!! Thank you very,
        very much!

        copy ("$html_dir/$figfile", "$html_dir/$figfile.tmp") or die "Can not make temporary copy of file: $1"; Isn't going to give you a meaningful error message, since as we pointed out earlier $1 is undef.

        IOW, your die message is going to look like: Can not make temporary copy of file: And you won't know which file the script died on.

        Try: copy ("$html_dir/$figfile", "$html_dir/$figfile.tmp") or die "Can not make temporary copy of file: $html_dir/$figfile\n";

        ----------
        Using perl 5.8.1-RC3 unless otherwise noted. Apache/1.3.33 (Darwin) unless otherwise noted. Mac OS X 10.3.9 unless otherwise noted.