perl default variable question
hi, i'm using a perl script i found to change the names of batches of files. The program works as is but it's giving me a weird warning. I'm familiar with $_, but not $_[3]. Can someone explain what $_[3] is, and how i can get this script to stop throwning the warning? Thanks, Ryan i found the file here: http://noisybox.net/computers/eren/ file download link: http://noisybox.net/computers/eren/eren.pl warning thrown: Use of uninitialized value in pattern match (m//) at C:\pPerl\eren.pl line 82. (i changed the file a bit so it won't be the same line number if you checkout the whole file) code from my file: 76 foreach my $file (@files){ 77 next if -d($root . $file); 78 79 next if (($preview) and not ($file =~ /$filefilter/)); 80 @_ = split /\//, $replacestr; 81 my $icase = ''; 82 ($_[3] =~ /i/) and $icase = 'i'; #** 83 my $cmd = sprintf(\$file =~ /%s/%s;, $_[1], $icase); 84 85 next if not eval $cmd; 86 87 $preview and print PREVIEW: ; 88 $matchct++; 89 90 my $oldfile = $file; 91 print $oldfile -- ; 92 $file =~ eval \$file =~ s$replacestr;; 93 print $file\n; 94 $preview and next; 95 rename($root . $oldfile, $root . $file) or print Failed to rename $root$oldfile\n; 96 } -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/
Re: perl default variable question
On 9/18/07, Ryan Moszynski [EMAIL PROTECTED] wrote: i'm using a perl script i found to change the names of batches of files. The program works as is but it's giving me a weird warning. I'm familiar with $_, but not $_[3]. Can someone explain what $_[3] is, and how i can get this script to stop throwning the warning? 80 @_ = split /\//, $replacestr; 81 my $icase = ''; 82 ($_[3] =~ /i/) and $icase = 'i'; $_[3] is the fourth element in the @_ array. Although that array is normally used for the subroutine parameter list, it seems that this programmer has used it to hold something else. (It would be better style to use a different variable, or even a list of well-named scalars. Splitting into @_ was somewhat common in Perl's ancient history, though; maybe this script was written more than ten years ago?) In any case, the error's source seems to be that @_ doesn't have at least four items, I'd guess because $replacestr didn't have at least three forward slashes and then some text. 83 my $cmd = sprintf(\$file =~ /%s/%s;, $_[1], $icase); 84 85 next if not eval $cmd; But since this code is using the evil eval, I'm confident that you can write a better (perhaps safer) program from scratch. It looks as if the programmer didn't know that you don't have to use the evil eval in order to be able to choose case-insensitive matches at run-time. And maybe the programmer didn't know that Perl can interpolate into double-quoted strings? sprintf isn't needed either. my $insensitive = $icase ? '(?:i)' : ''; next if not $file =~ /$insensitive$_[1]/; Good luck with it! --Tom Phoenix Stonehenge Perl Training -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/
Re: perl default variable question
On 9/18/07, Ryan Moszynski [EMAIL PROTECTED] wrote: thanks, so i can just test to see if $_[3] exists and it kills the warning. On 9/18/07, Andrew Curry [EMAIL PROTECTED] wrote: @_ is the list of incoming parameters to a sub. So if you write a sub, you refer to the first parameter in it as $_[0], the second parameter as $_[1] and so on. And you can refer to $_# as the index number of the last parameter: -Original Message- From: Ryan Moszynski [mailto:[EMAIL PROTECTED] Sent: 18 September 2007 15:12 To: beginners@perl.org Subject: perl default variable question hi, i'm using a perl script i found to change the names of batches of files. The program works as is but it's giving me a weird warning. I'm familiar with $_, but not $_[3]. Can someone explain what $_[3] is, and how i can get this script to stop throwning the warning? Thanks, Ryan i found the file here: http://noisybox.net/computers/eren/ file download link: http://noisybox.net/computers/eren/eren.pl warning thrown: Use of uninitialized value in pattern match (m//) at C:\pPerl\eren.pl line 82. (i changed the file a bit so it won't be the same line number if you checkout the whole file) code from my file: 76 foreach my $file (@files){ 77 next if -d($root . $file); 78 79 next if (($preview) and not ($file =~ /$filefilter/)); 80 @_ = split /\//, $replacestr; 81 my $icase = ''; 82 ($_[3] =~ /i/) and $icase = 'i'; #** 83 my $cmd = sprintf(\$file =~ /%s/%s;, $_[1], $icase); 84 85 next if not eval $cmd; 86 87 $preview and print PREVIEW: ; 88 $matchct++; 89 90 my $oldfile = $file; 91 print $oldfile -- ; 92 $file =~ eval \$file =~ s$replacestr;; 93 print $file\n; 94 $preview and next; 95 rename($root . $oldfile, $root . $file) or print Failed to rename $root$oldfile\n; 96 } -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/ This e-mail is from the PA Group. For more information, see www.thepagroup.com. This e-mail may contain confidential information. Only the addressee is permitted to read, copy, distribute or otherwise use this email or any attachments. If you have received it in error, please contact the sender immediately. Any opinion expressed in this e-mail is personal to the sender and may not reflect the opinion of the PA Group. Any e-mail reply to this address may be subject to interception or monitoring for operational reasons or for lawful business practices. -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/
Re: perl default variable question
:-) $_ is basically the first variable of @_ which is the array that Perl is currently working on. So when your script is complaining about something in $_[3] what it is saying is that the 4th variable (Perl starts counting at 0) in the @_ array is making the compiler unhappy. I hope this helps a bit. Look at line 83 of your code as you are using $_[3] in comparison, but $_[3] might be undefined which will cause your interpeter to scream at you. On 9/18/07, Ryan Moszynski [EMAIL PROTECTED] wrote: hi, i'm using a perl script i found to change the names of batches of files. The program works as is but it's giving me a weird warning. I'm familiar with $_, but not $_[3]. Can someone explain what $_[3] is, and how i can get this script to stop throwning the warning? Thanks, Ryan i found the file here: http://noisybox.net/computers/eren/ file download link: http://noisybox.net/computers/eren/eren.pl warning thrown: Use of uninitialized value in pattern match (m//) at C:\pPerl\eren.pl line 82. (i changed the file a bit so it won't be the same line number if you checkout the whole file) code from my file: 76 foreach my $file (@files){ 77 next if -d($root . $file); 78 79 next if (($preview) and not ($file =~ /$filefilter/)); 80 @_ = split /\//, $replacestr; 81 my $icase = ''; 82 ($_[3] =~ /i/) and $icase = 'i'; #** 83 my $cmd = sprintf(\$file =~ /%s/%s;, $_[1], $icase); 84 85 next if not eval $cmd; 86 87 $preview and print PREVIEW: ; 88 $matchct++; 89 90 my $oldfile = $file; 91 print $oldfile -- ; 92 $file =~ eval \$file =~ s$replacestr;; 93 print $file\n; 94 $preview and next; 95 rename($root . $oldfile, $root . $file) or print Failed to rename $root$oldfile\n; 96 } -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/
Re: perl default variable question
Ryan Moszynski wrote: hi, Hello, i'm using a perl script i found You should be careful with stuff you find lying around. to change the names of batches of files. The program works as is but it's giving me a weird warning. I'm familiar with $_, but not $_[3]. Can someone explain what $_[3] is, and how i can get this script to stop throwning the warning? $_[3] is the fourth element of the array @_. i found the file here: http://noisybox.net/computers/eren/ file download link: http://noisybox.net/computers/eren/eren.pl Did you read the second line of that file? # this program sucks and is a total hack and needs TONS of work... warning thrown: Use of uninitialized value in pattern match (m//) at C:\pPerl\eren.pl line 82. This means that the fourth element of the array @_ contains the value undef. (i changed the file a bit so it won't be the same line number if you checkout the whole file) code from my file: 76 foreach my $file (@files){ 77 next if -d($root . $file); 78 79 next if (($preview) and not ($file =~ /$filefilter/)); 80 @_ = split /\//, $replacestr; 81 my $icase = ''; 82 ($_[3] =~ /i/) and $icase = 'i'; #** 83 my $cmd = sprintf(\$file =~ /%s/%s;, $_[1], $icase); 84 85 next if not eval $cmd; As the comment says, this sucks. You can accomplish the same thing without using eval. 86 87 $preview and print PREVIEW: ; 88 $matchct++; 89 90 my $oldfile = $file; 91 print $oldfile -- ; 92 $file =~ eval \$file =~ s$replacestr;; 93 print $file\n; 94 $preview and next; 95 rename($root . $oldfile, $root . $file) or print Failed to rename $root$oldfile\n; 96 } 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 -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/