pem@yarra-glen.aaii.oz.au (Paul E. Maisano) (03/28/91)
Consider this program:
(don't run it unless you need a file called file.dat in the current dir.)
#!/usr/bin/perl
($debug = 1, shift) if $ARGV[0] eq '-d';
sub my_open {   # called with (file_handle, name) 
    local(*F, $name) = @_;
    if ($debug) {
	open(F, ">&STDOUT") || die "can't dup STDOUT: $!\n";
    }   
    else {
	open(F, ">$name") || die "open $name: $!\n";
    }   
}
# should this be: &my_open(*X, "file.dat");
&my_open(X, "file.dat");
print X "hello world\n";
close(X);
When I wrote this, I intended to pass the file handle as *X but I forgot
the *. It still worked so I wondered if I was confused about why I thought
the * was necessary. Is it necessary ? 
---
Paul Maisano,
Australian Artificial Intelligence Institutemerlyn@iwarp.intel.com (Randal L. Schwartz) (03/29/91)
In article <1991Mar28.053132.7061@yarra-glen.aaii.oz.au>, pem@yarra-glen (Paul E. Maisano) writes: | When I wrote this, I intended to pass the file handle as *X but I forgot | the *. It still worked so I wondered if I was confused about why I thought | the * was necessary. Is it necessary ? What's happening is that the 'X' is being passed as a literal string, as if you had said &my_open("X", "file.dat"); and then in the assignment within the subroutine: local(*F, $name) = @_; you are assigning: *F = "X"; which is the same as: *F = *X; except that the "X" is looked up at runtime. So, it is *safe* (at least in this case... don't overgeneralize!), but *inefficient*. print join(" ",("Perl","another","Just","hacker,")[2,1,0,3]) -- /=Randal L. Schwartz, Stonehenge Consulting Services (503)777-0095 ==========\ | on contract to Intel's iWarp project, Beaverton, Oregon, USA, Sol III | | merlyn@iwarp.intel.com ...!any-MX-mailer-like-uunet!iwarp.intel.com!merlyn | \=Cute Quote: "Intel: putting the 'backward' in 'backward compatible'..."====/