kramer31 wrote:
> Hi. I used perl a few years ago and found it to be wonderfully
> powerful, but I don't have my old code (it's proprietary) and I seem
> to have forgotten some of the subtelties of the language including how
> to use references properly ... I'm using strict here to help catch
> some of these subtle errors at compile time.
>
>
> Anyway, can someone look at the code and tell me what the *bleep* I'm
> doing wrong here?
>
> #!/usr/bin/perl -w
> use strict;
>
> sub checkDir {
> my $curDir = $_[0];
> my %files = %{$_[1]};
You are copying the entire hash to a hash that is only visible inside this
subroutine so why not just pass the whole hash in the first place:
checkDir( $curDir, %files );
And then copy it to your lexical hash inside the sub:
sub checkDir {
my ( $curDir, %files ) = @_;
If you intended to modify the other hash %files from inside the subroutine
then you need to use the reference instead of making a copy:
my %files;
checkDir( $curDir, \%files );
sub checkDir {
my ( $curDir, $files ) = @_;
# ...
# modify $files->{ $file }
}
> my $file;
>
> chdir($curDir);
>
> my @directories;
> my @listing=`ls`;
You would be better off using opendir/readdir or glob instead of an external
command. BTW, backquotes return "lines" which end in newlines which have to
be removed if you want the actual file names.
> my $fileType;
> my $myDir = `pwd`;
>
> foreach $file (@listing) {
> print "list: $file";
> $fileType=`file $file`;
You would be better off using stat/lstat instead of an external command.
> if($fileType =~ /directory/) {
> print "Added to directory\n";
> push @directories, $file;
@directories is local in scope to the subroutine and you are not using it
anywhere else?
> }
> else {
> if($fileType !~ /symbolic/) {
> print "regular file\n"
^
As was pointed out, the semicolon is missing there.
> if(! exists $files{ $file }) { #b
> my @tmpArray;
> $files{ $file } = \@tmpArray;
> }
That test and assignment is superfluous because perl uses autovivification.
> push @{ $files{ $file } }, $myDir; #a
>
> }
> }
> }
> }
>
> my $curDir = `pwd`;
> my %files = ();
>
> checkDir($curDir, \%files);
>
> #end of code
>
> The error at line labeled # a is:
> "my" variable %files masks earlier declaration in same scope
>
> The error at line labeled #b is:
> syntax error
>
> Any help would be much appreciated.
#!/usr/bin/perl
use warnings;
use strict;
use Cwd;
my $curDir = cwd;
opendir my $dh, $curDir or die "Cannot open '$curDir' $!";
my %files;
while ( my $file = readdir $dh ) {
lstat "$curDir/$file" or die "Cannot stat '$curDir/$file' $!";
!-d _ && !-l _ && push @{ $files{ $file } }, $curDir;
}
__END__
John
--
Perl isn't a toolbox, but a small machine shop where you can special-order
certain sorts of tools at low cost and in short order. -- Larry Wall
|