Re: Help with syntax
- From: "John W. Krahn" <someone@xxxxxxxxxxx>
- Date: Tue, 30 Jan 2007 01:39:42 GMT
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
.
- References:
- Help with syntax
- From: kramer31
- Help with syntax
- Prev by Date: Re: Win32::OLE problem with iTunes SelectedPlaylist
- Next by Date: FAQ 2.11 Perl Books
- Previous by thread: Re: Help with syntax
- Next by thread: FAQ 2.11 Perl Books
- Index(es):