943,913 Members | Top Members by Rank

Ad:
  • Perl Discussion Thread
  • Unsolved
  • Views: 931
  • Perl RSS
Apr 29th, 2009
0

Why doesn't this work? (filehandling+regexp)

Expand Post »
perl Syntax (Toggle Plain Text)
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4.  
  5. push @INC, "C:/Perl/Modules";
  6.  
  7. print "What is current download directory? ";
  8. my $dir = <STDIN>;
  9. opendir DH, $dir or die "Can't open directory...";
  10. my $parent = $_;
  11. while ($parent = readdir(DH))
  12. {
  13. next if $parent eq "." or $parent eq "..";
  14. if(-d $parent)
  15. {
  16. opendir DI, "$dir/$parent" or die "Can't open directory...";
  17. while ($_ = readdir(DI))
  18. {
  19. next if $_ eq "." or $_ eq "..";
  20. if (/(\w+ )(\d+)\b(\d+)\b(.*)(\d+)/)
  21. {
  22. print "Long File";
  23. our $month = $1;
  24. our $day = $2;
  25. our $year = $3;
  26. our $name = $5;
  27. }
  28. else if(/(\w+ )(\d+)\b(\d+)\b(.*)(\d)\b/)
  29. {
  30. print "Short File";
  31. our $month = $1;
  32. our $day = $2;
  33. our $year = $3;
  34. our $name = $5;
  35. }
  36. }
  37. }
  38. }
  39. print "Done";

I use Windows Vista with ActivePerl.
Basically I have a bunch of folders within a large parent folder each with two mp3 files and a txt file (which I don't care about) in this format:
Month DD YYYY . Name . ##(#)kbps . XX(X) minutes.mp3
the two mp3 files are exactly the same format that the ones with two digit minutes I want to name one way (lets say "short") and ones with 3 digits I want to name another way (lets say "long"). I also have other mp3 files which are not in this format and I cannot figure out a way to grab the length or bitrate of an mp3 file in perl (maybe someone can help with this too).

Anyway, this code does not run. I get a syntax errors at lines 28 and 38. I am using 'else if' wrong probably...
(ignore my misplaced mys and ours)

I am very new to Perl programming and would love some help. Thanks.
Reputation Points: 10
Solved Threads: 0
Newbie Poster
musturd is offline Offline
12 posts
since May 2008
Apr 29th, 2009
0

Re: Why doesn't this work? (filehandling+regexp)

try this:

Perl Syntax (Toggle Plain Text)
  1. my $dir = <STDIN>;
  2. chomp $dir;#<-- remove the end of line character(s)

and change "else if" to "elsif".
Last edited by KevinADC; Apr 29th, 2009 at 11:30 pm.
Reputation Points: 246
Solved Threads: 67
Practically a Posting Shark
KevinADC is offline Offline
898 posts
since Mar 2006
Apr 29th, 2009
0

Re: Why doesn't this work? (filehandling+regexp)

It's still giving me a syntax error at the else if line and the final closing bracket of the while loop.
(I'm sure you solved one problem with it though)
Reputation Points: 10
Solved Threads: 0
Newbie Poster
musturd is offline Offline
12 posts
since May 2008
Apr 29th, 2009
0

Re: Why doesn't this work? (filehandling+regexp)

Try this, I didn't really fix any syntax errors though besides "else if":

Perl Syntax (Toggle Plain Text)
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4.  
  5. push @INC, "C:/Perl/Modules";
  6.  
  7. print "What is current download directory? ";
  8. my $dir = <STDIN>;
  9. chomp $dir;
  10. opendir DH, $dir or die "Can't open directory: $!";
  11. while (my $parent = readdir(DH))
  12. {
  13. next if ($parent eq "." or $parent eq "..");
  14. if(-d $parent)
  15. {
  16. opendir DI, "$dir/$parent" or die "Can't open directory: $!";
  17. while ($_ = readdir(DI))
  18. {
  19. next if ($_ eq "." or $_ eq "..");
  20. if (/(\w+ )(\d+)\b(\d+)\b(.*)(\d+)/)
  21. {
  22. print "Long File";
  23. our $month = $1;
  24. our $day = $2;
  25. our $year = $3;
  26. our $name = $5;
  27. }
  28. elsif(/(\w+ )(\d+)\b(\d+)\b(.*)(\d)\b/)
  29. {
  30. print "Short File";
  31. our $month = $1;
  32. our $day = $2;
  33. our $year = $3;
  34. our $name = $5;
  35. }
  36. }
  37. }
  38. }
  39. print "Done";
Reputation Points: 246
Solved Threads: 67
Practically a Posting Shark
KevinADC is offline Offline
898 posts
since Mar 2006
Apr 29th, 2009
0

Re: Why doesn't this work? (filehandling+regexp)

Oops, I missed the elsif change you mentioned...
It runs now, but I didn't get any Long File or Short File returns, just the Done.
So either my regexps are wrong, or my directory handling is wrong. Am I doing anything else wrong?

The regular expression:
(\w+ ) - the month (any amount of word characters and a space)
(\d+) - 1 or 2 numbers (the day)
\b - a boundary
(\d+) - 4 numbers (the year)
\b - a boundary
(.*) - everything up to the last numbers in the string (because its greedy
(\d+) - 2 or 3 numbers (the length)

Is this wrong?
Reputation Points: 10
Solved Threads: 0
Newbie Poster
musturd is offline Offline
12 posts
since May 2008
Apr 30th, 2009
0

Re: Why doesn't this work? (filehandling+regexp)

Work on the script one problem at a time. First check that the directory I/O is working:

Perl Syntax (Toggle Plain Text)
  1. use warnings;
  2. use strict;
  3.  
  4. push @INC, "C:/Perl/Modules";
  5.  
  6. print "What is current download directory? ";
  7. my $dir = <STDIN>;
  8. chomp $dir;
  9. print "Current Directory is: $dir\n\n";
  10. opendir DH, $dir or die "Can't open directory: $!";
  11. while (my $parent = readdir(DH)){
  12. next if ($parent eq "." or $parent eq "..");
  13. print "> $parent\n";
  14. if(-d $parent){
  15. opendir DI, "$dir/$parent" or die "Can't open directory: $!";
  16. while (my $sub = readdir(DI)){
  17. next if ($sub eq "." or $sub eq "..");
  18. print ">>> $sub\n";
  19. }
  20. close DI;
  21. }
  22. }
  23. close DH;

Then if that is working try adding in the regexp stuff and see what happens. If it does not work then you have to figure out what the problem is.
Last edited by KevinADC; Apr 30th, 2009 at 1:09 pm.
Reputation Points: 246
Solved Threads: 67
Practically a Posting Shark
KevinADC is offline Offline
898 posts
since Mar 2006
May 1st, 2009
0

Re: Why doesn't this work? (filehandling+regexp)

It lists all of the files and subdirectories from parent directory but nothing in any of the subdirectories...
Last edited by musturd; May 1st, 2009 at 5:43 pm.
Reputation Points: 10
Solved Threads: 0
Newbie Poster
musturd is offline Offline
12 posts
since May 2008
May 1st, 2009
0

Re: Why doesn't this work? (filehandling+regexp)

If you want to drill down through all sub directories you should use the File::Find module that comes with perl.
Reputation Points: 246
Solved Threads: 67
Practically a Posting Shark
KevinADC is offline Offline
898 posts
since Mar 2006
May 1st, 2009
1

Re: Why doesn't this work? (filehandling+regexp)

If you really want to do it manually you need a recursive function, something like this:

Perl Syntax (Toggle Plain Text)
  1. use warnings;
  2. use strict;
  3.  
  4. #push @INC, "C:/Perl/Modules";
  5.  
  6. print "What is current download directory? ";
  7. my $dir = <STDIN>;
  8. chomp $dir;
  9.  
  10. list($dir);
  11.  
  12. sub list {
  13. my ($dir) = @_;
  14. print "$dir\n";
  15. opendir(my $DH, $dir) or do{print "Can't open $dir: $!\n"; return};
  16. my @list = grep {$_ ne '.' and $_ ne '..'} readdir $DH;
  17. foreach my $file (@list){
  18. print "\t$file\n";
  19. list("$dir/$file") if (-d "$dir/$file");
  20. }
  21. }
Last edited by KevinADC; May 1st, 2009 at 7:18 pm.
Reputation Points: 246
Solved Threads: 67
Practically a Posting Shark
KevinADC is offline Offline
898 posts
since Mar 2006
May 2nd, 2009
0

Re: Why doesn't this work? (filehandling+regexp)

Thanks a lot!!
Now I need to experiment with regular expressions...
Reputation Points: 10
Solved Threads: 0
Newbie Poster
musturd is offline Offline
12 posts
since May 2008

This thread is more than three months old

No one has posted to this discussion for at least three months. Please let old threads die and do not reply to them unless you feel you have something new and valuable to contribute that absolutely must be added to make the discussion complete. Otherwise, please start a new thread in this forum instead.
Message:
Previous Thread in Perl Forum Timeline: How to call a excel sheet from perl
Next Thread in Perl Forum Timeline: Generate unique strings of random numbers





About Us | Contact Us | Advertise | Acceptable Use Policy
Forum Index | Build Custom RSS Feed


Follow us on Twitter


© 2011 DaniWeb® LLC