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/