in reply to Re^3: Delete file from sub call within another sub
in thread Delete file from sub call within another sub

Hi Kenneth,

The code shown are just snippets of what I'm trying to do from actual code which is much larger. I am using strict, warnings and diagnostics which compiles error free, I just didn't include it this snippet. I had a typo in previous post. Actual code for subs should be with prototypes in sub definition below, $ was missing. However even with this corrected my code still fails. I have other code with same methodology within complete code using prototypes which works.

In your 1st reply I have tried &threeYrExpiration in sub call but deletion was omitted during process which means the & in front of sub actually affects the input parameter $abs_filename.

Change in logging level to warn and including $! shows actual error. However, this is strange because it says path is correct for actual file but saying doesn't exist as seen in error below:

sub file_handler { my ($abs_filename) = @_; if ((($current_mth == 1) && ($last_day_current_mth == 31)) { threeYrExpiration($abs_filename); } else { sevenYrExpiration($abs_filename); } } # End of sub file_handler sub threeYrExpiration($) { my $abs_filename = $_[0]; my $unlinkStatus = unlink("$abs_filename"); if ($unlinkStatus == 1) { $unlinkCountTotal++; $abs_filename =~ s#.*WORKAREA\/[^\/]*##; push (@deleted_files, $abs_filename); $task->AddFile("$abs_filename", "Deleted by content expiration + report"); $logger->info("File to be deleted added to job: $abs_filename" +); } else { $logger->warn("Failed to delete '$abs_filename': <$!>" +); $task->CallBack(1, "Error Deleting expired file"); } } sub sevenYrExpiration($) { ... ... }

Error:

Mon Nov 29 11:50:42 2010 : INFO : expiration_report.ipl : File to be deleted added to job: /committees/comm_wkgrps/inactive/cold_snap_tf/20040514_FDWG-EGWI_ISSUE_LIST Rev7.xls:

Mon Nov 29 11:50:42 2010 : WARN : expiration_report.ipl : Failed to delete '/iwmnt/default/main/internet/WORKAREA/home/committees/comm_wkgrps/inactive/cold_snap_tf/20040514_FDWG-EGWI_ISSUE_LIST Rev7.xls': <No such file or directory>

Replies are listed 'Best First'.
Re^5: Delete file from sub call within another sub
by kennethk (Abbot) on Nov 29, 2010 at 19:44 UTC
    The above still has syntax errors; instead of

    if ((($current_mth == 1) && ($last_day_current_mth == 31)) {

    you mean

    if (($current_mth == 1) && ($last_day_current_mth == 31)) {

    There is an unbalanced parenthesis.

    The bareword warning mentioned in my first post was due to your omitted block. The prototype system (see Prototypes in perlsub) is only in force when you use new-style calls (no &), though that you input changed after including makes me think you might be using that incorrectly. Is there a compelling reason to use prototypes here? In general, you are better off not using them unless you are doing something clever. You do not appear to be doing that here, so I would suggest removing it - they likely don't do what you think they do anyway. Additionally, prototypes cannot be enforced unless the subroutine declaration precedes any invocation of the method.

    When I compile the posted code, there are 6 undeclared variables: $unlinkCountTotal, @deleted_files, $task, $logger, $current_mth, and $last_day_current_mth. Based upon how you are using them, $task and $logger are objects which means you are using packages that you have not told us about. None of these variables are declared within the subroutines, which means you are either using closures or globals - I'm guessing the latter. Depending on the code that surrounds these methods, it is quite possible the actual variables referenced by those names change when you are cutting/pasting the code between the two subroutines. I can't know without seeing the surrounding code.

    The following code creates a file and then unlinks it. I wrote it by removing all the code you had that required additional variables and guessing intent. There are a number of additional stylistic issues that I am ignoring here.

    #!/usr/bin perl use strict; use warnings; my $name = 'junk'; open my $fh, '>', $name or die "Open fail: $!"; print $fh 'some content'; close $fh; file_handler($name); sub threeYrExpiration($) { my $abs_filename = $_[0]; my $unlinkStatus = unlink("$abs_filename"); if ($unlinkStatus == 1) { warn "Success"; } else { warn "Fail"; } } sub file_handler { my ($abs_filename) = @_; threeYrExpiration($abs_filename); }

    Take this code and systematically add elements that appear in your total script until it breaks. Then post that code. As I said in the original response, the issue is not in the code you posted.