2010-05-26 2 views
9

मुझे किसी नामस्थान में पैकेज प्रतीक निर्यात करने का तरीका समझने में समस्या हो रही है। मैंने लगभग समान रूप से प्रलेखन का पालन किया है, लेकिन ऐसा लगता है कि किसी भी निर्यात प्रतीक के बारे में नहीं पता है।मैं पर्ल में नामस्थान में पैकेज प्रतीक कैसे निर्यात करूं?

mod.pm

#!/usr/bin/perl 

package mod; 

use strict; 
use warnings; 

require Exporter; 

@ISA = qw(Exporter); 
@EXPORT=qw($a); 


our $a=(1); 

1; 

test.pl

$ cat test.pl 
#!/usr/bin/perl 

use mod; 

print($a); 

यह चल रहा है यह

$ ./test.pl 
Global symbol "@ISA" requires explicit package name at mod.pm line 10. 
Global symbol "@EXPORT" requires explicit package name at mod.pm line 11. 
Compilation failed in require at ./test.pl line 3. 
BEGIN failed--compilation aborted at ./test.pl line 3. 

$ perl -version 
This is perl, v5.8.4 built for sun4-solaris-64int 
+1

सुंदर प्राचीन पर्ल। यदि आप कर सकते हैं तो आप बेहतर अपग्रेड करेंगे। – tsee

+1

विरासत प्रणाली, मैं इसके साथ अटक गया हूं – Mike

+1

नीचे दिए गए उत्तरों का संक्षिप्त संस्करण पहले ही टीएफएम में समझाया गया है: http://p3rl.org/Exporter#Good_Practices – daxim

उत्तर

17

यह आपको नहीं बता रहा है कि आपको $a निर्यात करने में समस्या हो रही है। यह आपको बता रहा है कि आपको @ISA और @EXPORT घोषित करने में समस्या हो रही है। @ISA और @EXPORT पैकेज चर हैं और strict के तहत, उन्हें our कीवर्ड (या अन्य मॉड्यूल से आयातित) के साथ घोषित करने की आवश्यकता है - लेकिन उन दोनों के साथ संभव नहीं है)। वे semantically अलग हैं - लेकिन कार्यात्मक रूप से अलग नहीं - $a से।

नैनी नोट:@EXPORT विनम्र नहीं माना जाता है। Exporter के माध्यम से यह अपने प्रतीकों का उपयोग कर पैकेज में डंप करता है। संभावना है कि आप सोचें कि निर्यात करने के लिए कुछ अच्छा है - और यह है - तो उपयोगकर्ता के अनुरोध के लिए यह उचित होगा। इसके बजाय @EXPORT_OK का उपयोग करें।

14

इस प्रयास करें का परिणाम है:

package mod;    # Package name same as module. 

use strict; 
use warnings; 

use base qw(Exporter); 

our @ISA = qw(Exporter); # Use our. 
our @EXPORT = qw($z);  # Use our. Also $a is a bad variable name 
          # because of its special role for sort(). 

our $z = 1; 

1; 
6

दूसरों ने सही ढंग से समस्या की पहचान की है और समाधान की पेशकश की है। मैंने सोचा कि यह एक डीबगिंग टिप को इंगित करने के लिए उपयोगी होगा। एक दिया फाइल करने के लिए एक समस्या को अलग करने के लिए आपको सिर्फ इतना है कि perl -c का उपयोग कर फ़ाइल को संकलित करने का प्रयास कर सकते हैं (perlrun को देखें):

perl -c mod.pm 

यह आपको एक ही त्रुटि संदेश दिया होता, महसूस करने के लिए समस्या है अग्रणी आप आपकी .pm फ़ाइल, आपकी .pl फ़ाइल नहीं।