Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Perl > Perl Misc > Help with syntax

Reply
Thread Tools

Help with syntax

 
 
kramer31
Guest
Posts: n/a
 
      01-29-2007
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]};
my $file;

chdir($curDir);

my @directories;
my @listing=`ls`;
my $fileType;
my $myDir = `pwd`;

foreach $file (@listing) {
print "list: $file";
$fileType=`file $file`;
if($fileType =~ /directory/) {
print "Added to directory\n";
push @directories, $file;
}
else {
if($fileType !~ /symbolic/) {
print "regular file\n"
if(! exists $files{ $file }) { #b
my @tmpArray;
$files{ $file } = \@tmpArray;
}

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.

 
Reply With Quote
 
 
 
 
kens
Guest
Posts: n/a
 
      01-30-2007


On Jan 29, 6:35 pm, "kramer31" <(E-Mail Removed)> 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]};
> my $file;
>
> chdir($curDir);
>
> my @directories;
> my @listing=`ls`;
> my $fileType;
> my $myDir = `pwd`;
>
> foreach $file (@listing) {
> print "list: $file";
> $fileType=`file $file`;
> if($fileType =~ /directory/) {
> print "Added to directory\n";
> push @directories, $file;
> }
> else {
> if($fileType !~ /symbolic/) {
> print "regular file\n"
> if(! exists $files{ $file }) { #b
> my @tmpArray;
> $files{ $file } = \@tmpArray;
> }
>
> 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.


Put a semicolon at the end of this line:
print "regular file\n"

HTH, Ken


 
Reply With Quote
 
 
 
 
kramer31
Guest
Posts: n/a
 
      01-30-2007
Wow. Thanks a lot. I can't believe I posted a semicolon question to
the newsgroup. I should remember that line number error don't always
refer to the exact line where the error is.


Thanks again.


On Jan 29, 4:20 pm, "kens" <(E-Mail Removed)> wrote:
> On Jan 29, 6:35 pm, "kramer31" <(E-Mail Removed)> 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]};
> > my $file;

>
> > chdir($curDir);

>
> > my @directories;
> > my @listing=`ls`;
> > my $fileType;
> > my $myDir = `pwd`;

>
> > foreach $file (@listing) {
> > print "list: $file";
> > $fileType=`file $file`;
> > if($fileType =~ /directory/) {
> > print "Added to directory\n";
> > push @directories, $file;
> > }
> > else {
> > if($fileType !~ /symbolic/) {
> > print "regular file\n"
> > if(! exists $files{ $file }) { #b
> > my @tmpArray;
> > $files{ $file } = \@tmpArray;
> > }

>
> > 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.Put a semicolon at the end of this line:

> print "regular file\n"
>
> HTH, Ken


 
Reply With Quote
 
J. Gleixner
Guest
Posts: n/a
 
      01-30-2007
kramer31 wrote:
> Wow. Thanks a lot. I can't believe I posted a semicolon question to
> the newsgroup. I should remember that line number error don't always
> refer to the exact line where the error is.


FYI: Take a look at File::Find. You could do the same thing with only
a few lines of code, using that module.
 
Reply With Quote
 
John W. Krahn
Guest
Posts: n/a
 
      01-30-2007
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
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Syntax Checker that's better than the normal syntax checker Jacob Grover Ruby 5 07-18-2008 05:07 AM
Syntax error? What syntax error? Assignment fo default values? Mark Richards Perl Misc 3 11-18-2007 05:01 PM
Syntax bug, in 1.8.5? return not (some expr) <-- syntax error vsreturn (not (some expr)) <-- fine Good Night Moon Ruby 9 07-25-2007 04:51 PM
[ANN] SqlStatement 1.0.0 - hide the syntax of SQL behind familiarruby syntax Ken Bloom Ruby 3 10-09-2006 06:46 PM
Syntax highligth with textile: Syntax+RedCloth ? gabriele renzi Ruby 2 12-31-2005 02:44 AM



Advertisments