Lori wrote: > > Im used to subs in C or VB but this has me puzzled... I am > trying to pass a scalar ref to a subroutine, When I try to use > the value of the passed parm inside the sub Im getting a garbage > value (has address instead of value? ) from my process_files > sub,and the increment sub, but the sub that I dont declare a > prototype on or use () in the func. definition It works ?? > > Can someone spot my error, or tell me the right way to pass a > scalar to a sub and use it ?
Hi Lori. I'd forget about declaring and prototyping Perl subroutines if I were you: it's rarely necessary. > #!/usr/bin/perl -w > use warnings; > use strict; > > #prototypes > sub increment(\$); > sub process_files(\$); These prototypes force the type of the actual parameter to be a single scalar variable. A reference to it is passed in the subroutine's parameter array. If you left them unprototyped then Perl would just do the usual thing of passing the parameter by value, but aliasing the parameter array element to the actual parameter. Read on. > my $a= 5; > my $pc_unzipped_file = > 'C:\\TMCC\\CIT_153\\hw9\\hw9_files\\CNUTLZD.TXT'; > > increment($a); > print $a; > process_files($pc_unzipped_file); > > my $a= 5; > my $pc_unzipped_file = > 'C:\\TMCC\\CIT_153\\hw9\\hw9_files\\CNUTLZD.TXT'; > > increment($a); > print $a; > > process_files($pc_unzipped_file); > > #function defs > sub increment(\$){ > > my $reference = shift; > print "\nThe reference:$reference\n"; > print "\nThe reference:@_\n"; > > $$reference++; > > } This function is right as it stands. The only problem is that you're trying to print the reference as a scalar value without dereferencing it. If you wrote: print "\nThe reference: $$reference\n"; then you'd get what I think you're expecting. But the most obvious way to write this is without the prototype: sub increment { print "\nParameter: $_[0]\n"; $_[0]++; } so that the parameter is passed by value, but altering the @_ parameter array element also alters the actual parameter. > sub process_files(\$){ > > my $file_ref = shift; > > print "\nGot the Filename: $file_ref \n"; > > print "\nGot the Filename: @_\n"; > } Same here, but since you're not modifying the parameter there's no excuse for passing by reference anyway. You could prototype it as sub process_files($) but you may as well just accept the default behaviour: sub process_files { my $file = shift; print "\nGot the Filename: $file\n"; } > first (1,2,3); > > sub first > # how come no () here ? , also I notice they dont create a > prototype I think I've explained that above. If you declare a subroutine then the definition has to match that declaration. But there's no need to declare any subroutines at all. > { > print "\nIn first the ars are @_\n"; > # this allows me to get at values inside the sub which is what > I need. > } > I hope this helps. Rob _______________________________________________ Perl-Win32-Users mailing list [EMAIL PROTECTED] To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs