Been away from the computer for a while, and I see that some of your
questions have been addressed, but I will add a few comments.

On Dec 1, 10:44 am, [EMAIL PROTECTED] wrote:
> Thanks for taking time to respong and go clear thru the script bit by
> bit.
>
> kens <[EMAIL PROTECTED]> writes:
>
> [...]
>
> > #  The following lines are your friend
> > use strict;
> > use warnings;
>
> I've seen that before but didn't understand why.
>
> The `warnings' part is clear enough but doesn't the -w flag do something
> similar?  But why `strict'?
>

see the documentation (perldoc strict) for more explanation.
I like it because it keeps me from shooting myself in the foot when I
misspell a variable name. If forces you to define all variables.

For example:

without strict I could say:

$this = 20;
print "$thus\n";

and no error is generated.

Withh strict:

use strict;
my $this = 20;
print "$thus\n";

An error message indicates that variable $thus is unknown.
This can help find subtle errors.

>
>
> >> if(!$ARGV[1]){
> >>    usage();
> >>    print "Too few arguments.. exiting\n";
> >>    exit;
>
> >> }
>
> >> if($ARGV[2]){
> >>    usage();
> >>    print "Too many arguments... exiting\n";
> >>    exit;}
>
> >> use Cwd;
> >> my $Cwd = getcwd;
>
> >> use File::Copy;
>
> > Define variables in the smallest scope
> > Plus only define variables you use, otherwise it can get confusing
> >> my ($HiNum, $Copied, $TrgDir, @DirContent, $Cnt, $Line);
> >> $TrgDir = shift;
> >> $HiNum  = 0;
> >> $Copied = 0;
>
> Is there something there, I don't use?  I'm not seeing which one.
>
> [...]
>
> > To declare in smallest scope:
> > my @DirContent = grep { /^[0-9]/ } readdir($DIR);
> >> @DirContent = grep { /^[0-9]/ } readdir(DIR);
>
> Not to be obtuse but why is declaring in smallest scope important
> here?  I know that is commonly offered as advice but I don't think I
> have seen any explanation as to why.
>
> This script is a helper script, so why is declaring variables like:
>
>   my $var = value
>
> in the main part of the script a bad thing?
>
> That already limits the scope to this script which itself seems
> unnecessary.  Like I could have just said:
>
>    $var = value in the main part and been ok, I used `my' for the
> unlikely event I someday write something that references this script
> like a function to some other script by slurping it.  I don't know
> enough perl to see why I need to make that declaration inside a
> function or internal loop or other more limited scope.
>

Look at the following article on scope (Look at When to Declare
Variables):
http://www.developer.com/lang/perl/article.php/3323421
http://www.developer.com/lang/perl/article.php/10940_3323421_2

> > This test add nothing. The for loop will fail if there is no content
>
> >> if ($DirContent[0]){
>
> Checking to make sure there are in fact numbered files already in
> TrgDir.  As often as not it is a newly created and empty directory.
>
> If there aren't numbered files alread in it then no need for the for
> loop.  So testing for value of $DirContent[0]) was supposed to bypass
> the for loop if it were empty of value.

My point was that the for loop does this check for you. The if is
redundant.

>
> >>    for(@DirContent){
>
> > Do these files only contain numbers?
>
> Yes.  Note the argument to grep earlier /^[0-9]/.
> I guess that should have been /^[0-9]+/ but the directories to be
> copied from are populated by NNTP which always uses numbering.
>

If a file happened to contain a number and text, it would also match,
and it mat break your code.

> >> ## If we already have numbered files, Start our counter with
> >> ## the highest one
> >> if($HiNum){
> >>    $Cnt = $HiNum;
> >> }
>
> Then the above test (using the result of the for loop if not bypassed)
> is supposed to decide if we need to increase Cnt so as not to clobber
> any existing files.  If HiNum is still zero then there weren't any in
> the TrgDir and no need to bump the Cnt up to protect them.
>
>
>
> >> while(<>){
> >>    chomp;
> >>    $Cnt++ ;
> >>    ## The first if clause here is unnecessary now... to be removed
> >>    if($TrgDir){
> >>       ## Add the correct path if our line doesn't start with '/'
>
> > Use different delimiters if searching for a slash
>
> Is that faster or somehow better than escaping the slash?
>

Easier to read, you don't have two adjacent slashes.

> >>     if(!/^\//){
> >>          $Line = $Cwd ."/". $_;
>
> [...]
>
> >> ## Report how many files were copied
> >> print " <$Copied> Files copied to:\n $TrgDir\n\n";
>
> >> print " ".CountTrgDir()."\n";
>
> > should be closedir($DIR);
> >> close(DIR);
> > The main problem, I believe, is that you are using a stale directory
> > handle. closedir (in main) and opendir here.
>
> Ha... and that was the problem... turns out it doesn't need to be
> moved.  Once the typeo is corrected to closedir(DIR); it works, with
> no reopen.
>
> [...]
>
> > use File::Basename;
>
> >> sub usage {
>
> > #  use this line to get the name of your script
> > # perldoc File::Basename
> >  my ( $myscript ) = fileparse( "$0", "" );
>
> [...]
>
> >> Usage: \`$myscript TARGETDIRECTORY SOURCEFILE'
>
> Somehow in the course of many edits these lines up near the top were
> lost.  I insert them in most of my homeboy scripts for use in the
> usage function:
>
>    my $myscript;
>   ($myscript = $0) =~ s:^.*/::;
>
> Is it still better to pull in a whole new module
> (`use File::Basename;') to do that?

Your method will not list the full path to the script unless the full
path is given on the command line.
NOTE: I have a useless use of quotes, should have been:
   my ( $myscript ) = fileparse( $0, '' );

HTH, Ken


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to