2012-12-26 6 views
6

मैं ऐसे कोड देखा:क्या प्रतीक :: gensym अभी भी perl 5.6 के बाद और भी उपयोगी है?

my $fh = gensym;            
open $fh, ">$name" or die "Can't create $name: $!"; 

जो के रूप में लिखा जा सकता है:

open my $fh, ">$name" or die "Can't create $name: $!"; 

gensym सिर्फ विरासत या अभी भी कुछ अवसरों में उपयोगी है?

उत्तर

8

विरासत। कभी-कभी पुराने मॉड्यूल द्वारा आवश्यक शब्दावली के बजाय ग्लोब, लेकिन यह है।

use IPC::Open3 qw(open3); 
open(local *CHILD_STDIN, '<', '/dev/null') or die $!; 
my $pid = open3(
    '<&CHILD_STDIN', 
    my $CHILD_STDOUT = gensym(), 
    my $CHILD_STDERR = gensym(), 
    $cmd, @args, 
); 

दूसरी सोचा पर, आप भी अन्य नाम बना करने के लिए (हालांकि Data::Alias lexicals के साथ ऐसा कर सकते हैं) उन्हें इस्तेमाल कर सकते हैं।

my $foo; 
our $bar; local *bar = \$foo; 
$foo = 123; say $bar; # 123 
$bar = 456; say $foo; # 456 
+0

क्या आपका मतलब यह है कि अगर मैं इस मामले में सीधे 'मेरा $ CHILD_STDOUT' पास करता हूं तो यह काम नहीं करेगा? –

+0

@new_perl, stdout के लिए, यह काम करेगा, लेकिन stderr के लिए नहीं। लेकिन यह भी ध्यान रखें कि stdin के लिए एक ग्लोब का उपयोग किया जाता है। ('Gensym' के बारे में बात करना मूर्खतापूर्ण है क्योंकि यह सिर्फ '\ local * NAME' है, लेकिन हर बार एक नए नाम के साथ।) – ikegami

+0

यह stderr के लिए क्यों काम नहीं करेगा? –