पूरी तरह से सामान्य स्थिति में, आप क्या नहीं कर सकते आप perlref से निम्नलिखित अंश करने के लिए धन्यवाद करना चाहते हैं:
*foo{THING}
undef
लौटाता है यदि स्केलर्स के मामले में छोड़कर उस विशेष चीज का अभी तक उपयोग नहीं किया गया है। *foo{SCALAR}
एक अज्ञात स्केलर का संदर्भ देता है यदि $foo
अभी तक उपयोग नहीं किया गया है। यह भविष्य की रिलीज में बदल सकता है।
लेकिन अगर आप प्रतिबंध यह है कि किसी भी अदिश एक निर्धारित मान पता लगाया जा करने के लिए आवश्यक स्वीकार करने को तैयार हैं, तो आप उपयोग कर सकते हैं कोड इस तरह के
#! /usr/bin/perl
use strict;
use warnings;
open my $fh, "<", \$_; # get DynaLoader out of the way
my %before = %main::;
require "my.config";
my %after = %main::;
foreach my $name (sort keys %after) {
unless (exists $before{$name}) {
no strict 'refs';
my $glob = $after{$name};
print "\$$name\n" if defined ${ *{$glob}{SCALAR} };
print "\@$name\n" if defined *{$glob}{ARRAY};
print "%$name\n" if defined *{$glob}{HASH};
print "&$name\n" if defined *{$glob}{CODE};
print "$name (format)\n" if defined *{$glob}{FORMAT};
print "$name (filehandle)\n" if defined *{$glob}{IO};
}
}
के रूप में तुम वहाँ मिल जाएगा।
$JACKPOT = 3_756_788;
$YOU_CANT_SEE_ME = undef;
@OPTIONS = qw/ apple cherries bar orange lemon /;
%CREDITS = (1 => 1, 5 => 6, 10 => 15);
sub is_jackpot {
local $" = ""; # " fix Stack Overflow highlighting
"@_[0,1,2]" eq "barbarbar";
}
open FH, "<", \$JACKPOT;
format WinMessage =
You win!
.
उत्पादन का my.config
साथ
%CREDITS
FH (filehandle)
$JACKPOT
@OPTIONS
WinMessage (format)
&is_jackpot
नाम मुद्रण एक छोटे से काम लेता है, लेकिन हम बोझ के भाग लेने के लिए Data::Dumper
मॉड्यूल का उपयोग कर सकते हैं। सामने बात समान है:
#! /usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
sub _dump {
my($ref) = @_;
local $Data::Dumper::Indent = 0;
local $Data::Dumper::Terse = 1;
scalar Dumper $ref;
}
open my $fh, "<", \$_; # get DynaLoader out of the way
my %before = %main::;
require "my.config";
my %after = %main::;
हम कुछ अलग ढंग से विभिन्न स्लॉट्स डंप करने की जरूरत है और प्रत्येक मामले में संदर्भ से घिरे होने निकालें: %before
के बीच सेट अंतर से अधिक
my %dump = (
SCALAR => sub {
my($ref,$name) = @_;
return unless defined $$ref;
"\$$name = " . substr _dump($ref), 1;
},
ARRAY => sub {
my($ref,$name) = @_;
return unless defined $ref;
for ("\@$name = " . _dump $ref) {
s/= \[/= (/;
s/\]$/)/;
return $_;
}
},
HASH => sub {
my($ref,$name) = @_;
return unless defined $ref;
for ("%$name = " . _dump $ref) {
s/= \{/= (/;
s/\}$/)/;
return $_;
}
},
);
अंत में, हम पाश और %after
:
foreach my $name (sort keys %after) {
unless (exists $before{$name}) {
no strict 'refs';
my $glob = $after{$name};
foreach my $slot (keys %dump) {
my $var = $dump{$slot}(*{$glob}{$slot},$name);
print $var, "\n" if defined $var;
}
}
}
अपने प्रश्न से my.config
का उपयोग करना, उत्पादन
01 है
$ ./prog.pl
@A = ('a','b','c')
%B = ('b' => 'bee')
$C = 'see'
क्या आपका वर्तमान कोड स्निपेट आपके लिए काम कर रहा है? यदि नहीं, तो क्या आपके पास एक साधारण नमूना कॉन्फ़िगरेशन फ़ाइल है जिसे आप पोस्ट कर सकते हैं? –
@ अणुओं मैंने एक नमूना विन्यास जोड़ा है। यह सिर्फ बहुत ही सरल पर्ल है। – bukzor
@ अणुओं: यदि मैं इसे सही ढंग से समझता हूं, तो इसका मतलब है कि मुझे हमेशा स्केलर्स के लिए झूठी सकारात्मकता मिलती है, लेकिन फिर मैं जांच सकता हूं कि मान अनिश्चित है, और मुझे अभी भी ARRAY और HASH का पता लगाने में सक्षम होना चाहिए। – bukzor