On 30 Nov 2007 at 10:35, John W.Krahn wrote:

> On Friday 30 November 2007 09:07, Beginner wrote:

> Hello,

> [ SNIP ]
> 
> > $| = 1;
> 
> You never print to STDOUT so that line is superfluous.
> > my $in = 0;
> >
> > my $sRootPath = 'e:/';
> >
> > my
> > ($osVolName,$lVolName,$ouSerialNum,$ouMaxNameLen,$osFsType,$ouFsFlags
> >, $lFsType);
> > GetVolumeInformation( $sRootPath, $osVolName, $lVolName,
> > $ouSerialNum, $ouMaxNameLen, $ouFsFlags, $osFsType, $lFsType );
> 
> You can declare and define the variables at the same time:
> 
> GetVolumeInformation( $sRootPath, my ( $osVolName, $lVolName, 
> $ouSerialNum, $ouMaxNameLen, $ouFsFlags, $osFsType, $lFsType ) );
> 
> But it looks like the only variables you are using there are $sRootPath 
> and $osVolName so perhaps this will work:
> 
> GetVolumeInformation( $sRootPath, my $osVolName, undef, undef, undef, 
> undef, undef, undef );
> 
> Or perhaps even just:
> 
> GetVolumeInformation( $sRootPath, my $osVolName );
> 
> 
> > my $file = $osVolName.'.txt';
> > open(LOG,">$file") or die "Can't write $file: $!\n";
> > print LOG "Contents of Disk with Volume Name $osVolName\n\n";
> > my $pos = tell LOG;
> >
> > print LOG "\n\n\n\n\n\n\n\n\n\n\n\n"; # Add space for summary.
> > print LOG "-------------------------\n";
> >
> > my @dirs;
> > my %uniq;
> > find(\&files,$sRootPath);
> >
> > # Summary text.
> > seek(LOG, $pos, 0);
> 
> You should use the seek constants from the Fcntl module:
> 
> use Fcntl ':seek';
> 
> seek LOG, $pos, SEEK_SET or die "Cannot seek on '$file' $!";
> 
> 
> > print LOG "CD Has ",($#dirs + 1)," folders: ";
> 
> ($#dirs + 1) may or may not be the correct number.  Better to use the 
> actual number of @dirs elements:
> 
> print LOG "CD Has ", scalar @dirs," folders: ";
> 
> 
> > for (@dirs) {
> >     print LOG "$_, ";
> > }
> 
> That will print ', ' at the end of the line.  You probably want to do 
> this instead:
> 
> print LOG join ', ', @dirs;
> 
> 
> > print LOG "\n\nTotal number of files: $in\n";
> >
> >
> > sub files {
> >     my $section;
> >     ($section) = ($File::Find::dir =~ /$sRootPath(\w{1})/);
> 
> You can declare and define the variables at the same time:
> 
>       my ( $section ) = $File::Find::dir =~ /$sRootPath(\w{1})/;
> 
> (\w{1}) could also be written as (\w).  You should anchor the pattern 
> as the RootPath should only occur at the beginning of the string.  You 
> should probably quotemeta the string as it may contain regular 
> expression meta-characters:
> 
>       my ( $section ) = $File::Find::dir =~ /\A\Q$sRootPath\E(\w)/;
> 
> 
> > # unique folder only
> >     if (! exists($uniq{$section}) && $section =~ /\w/) {
> 
> The test '$section =~ /\w/' seems redundant.  Perhaps that should be 
> 'defined $section' instead.
> 
>       if ( defined( $section ) && ! exists( $uniq{ $section } ) ) {
> 
> 
> >             push(@dirs,$section);
> >             $uniq{$section} = 0;
> >     }
> > # Count the files and print em'
> >     if ($_ =~ /jpg/i) {
> 
> If you are trying to match a '.jpg' file extention then you should 
> anchor the pattern so you don't match 'jpg' somewhere in the middle of 
> the file name:
> 
>       if ( /\.jpg\z/i ) {
> 
> 
> >             ++$in;
> >             print LOG "$section\t$_\n";
> >     }
> > }
> 
> John
> -- 
> use Perl;
> program
> fulfillment

Thanx to you both. I appreciate now that "\n" is 2 bytes and I should 
be working in bytes with seek/tell.

John an added thanx for the line by line comments particulatly the 
join and scalar tips.

Much appreciated.
Dp.


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


Reply via email to