2010-08-30 13 views
6

पर एक अपरिभाषित मान पर विधि "एक्स" को कॉल नहीं कर सकता है, विशेष रूप से डीबीआई में, मुझे यह संदेश हर समय आता है। यह भ्रमित है, क्योंकि पहली बात यह है कि दिमाग में आने वाली तर्क यह है कि मैं जो फ़ंक्शन पारित कर रहा हूं, वे अनिश्चित (या कुछ समान) पर सेट हैं, लेकिन यह स्पष्ट रूप से मामला नहीं है।

एक मॉड्यूल और एक इसी लिपि को देखते हुए ...

मॉड्यूल: ./lib/My/Module.pm

package My::Module; 

use strict; 
use warnings; 

sub trim { 
    my $str = shift; 
    $str =~ s{ \A \s+ }{}xms; # remove space from front of string 
    $str =~ s{ \s+ \z }{}xms; # remove space from end of string 
    return $str; 
} 

स्क्रिप्ट: ./test.pl

#!/usr/bin/perl 

use strict; 
use warnings; 
use My::Module qw(trim); 

print $My::Module->trim(" \t hello world\t \t"); 

मैं वापस पाने त्रुटि संदेश

सीए फोन नहीं विधि अगर मैं फोन $My::Module->notamethod("hello world"); यह एक ऐसी ही त्रुटि देता है ./text.pl लाइन 7.

दरअसल पर एक अपरिभाषित मूल्य पर "ट्रिम",।

उपरोक्त स्क्रिप्ट/मॉड्यूल के साथ क्या गलत है?

क्या त्रुटि Can't call method “X” on an undefined value at ${SOMEFILE} line ${SOMELINE} वास्तव में कह रही है? क्या यह विधि कॉल (प्रिंट करने के लिए यहां पारित) के संदर्भ का संदर्भ देता है, या तर्कों का संदर्भ?

उत्तर

6

वह वाक्यविन्यास $My::Module परिवर्तनीय में किसी ऑब्जेक्ट या क्लासनाम की तलाश में है और इसकी ट्रिम विधि को कॉल कर रहा है, लेकिन वह चर अपरिभाषित है।

इसके बजाय, आप मेरा :: मॉड्यूल :: ट्रिम() फ़ंक्शन कॉल करने के लिए बस print My::Module::trim(" \t hello world\t \t"); कहना चाहते हैं।

उपयोग लाइन से, ऐसा लगता है कि आप स्थानीय पैकेज में ट्रिम() आयात करने की कोशिश कर रहे हैं ताकि आप इसे My::Module:: योग्यता के बिना कॉल कर सकें, लेकिन आपका मॉड्यूल ऐसा नहीं लगता है कि इसे निर्यात करने के लिए सेट अप किया गया है ।

आपके regexes में,/s और/m झंडे का कोई प्रभाव नहीं पड़ता है - वे केवल बदलते हैं।, ^, और $ match, और आप इनमें से किसी का भी उपयोग नहीं करते हैं।

+0

मैं रेगेक्स लिखते समय उन्हें डालता हूं क्योंकि मुझे टिप्पणियां इनलाइन करना पसंद है :)। मैं बस उदाहरण के लिए उन्हें बाहर ले जाना भूल गया। – heymatthew

+1

@ द डेमन्स एडवोकेट,/एस और एम के पास इनलाइन टिप्पणियों के साथ कुछ लेना देना नहीं है। वह/एक्स है। – cjm

-1

यह सिर्फ पर्ल ओओ करता है। जिस तरीके से आप विधियों को कॉल करते हैं, उसके बीच अंतर होता है।

यह सिर्फ मेरे में ट्रिम उप :: मॉड्यूल पैकेज कॉल:

My::Module::trim('foo') 

दूसरी ओर,

My::Module->trim('foo) 

अपने आप मेरी में ट्रिम उप के लिए एक कॉल हो जाता है :: पहले तर्क के रूप में स्ट्रिंग "माई :: मॉड्यूल" के साथ मॉड्यूल पैकेज।

my $m = My::Module->new; # Corrected. Thanks for pointing this out. 
$m->trim('foo'); 

ही उप के लिए एक कॉल में बदल जाता है, लेकिन पहले तर्क के रूप में $ एम ऑब्जेक्ट के संदर्भ के साथ इस समय: वस्तुओं उसी तरह काम करते हैं।

आपको क्या करने की कोशिश कर रहे हैं:

$My::Module->trim('foo'); 

कौन सा चर $ मेरे :: मॉड्यूल (जो मौजूद नहीं है), इस प्रकार त्रुटि संदेश "कॉल नहीं कर सकता विधि एक्स के एक भिन्नता के लिए अनुवाद एक अपरिभाषित मूल्य पर "। यदि $ My :: मॉड्यूल किसी ऑब्जेक्ट का वास्तविक संदर्भ था, तो इसके परिणामस्वरूप उस ऑब्जेक्ट पर ट्रिम() को कॉल किया जाएगा, संदर्भ को एक अंतर्निहित प्रथम तर्क के रूप में संदर्भित किया जाएगा।

संपादित करें: दोनों टिप्पणीकर्ता सही हैं। यह उत्तर मूल रूप से स्वीकार किए गए उत्तर पर टिप्पणी के रूप में किया गया था। (क्या इसे ठीक करने का कोई तरीका है?)

भ्रम के लिए खेद है। मैंने यहां थोड़ा और विस्तार जोड़ा है, इसलिए उम्मीद है कि यह मूल प्रश्न से संबंधित है (यह एक अनिर्धारित चर को संदर्भित करता है)।

+1

आपको अपनी 'नई' लाइन के लिए अप्रत्यक्ष विधि वाक्यविन्यास का उपयोग नहीं करना चाहिए। यहां देखें: http://stackoverflow.com/questions/429657/what-is-the-difference-between-new-someclass-and-someclass- new-in-perl/429798#429798 – friedo

+0

इस पोस्ट की जानकारी सच है, लेकिन वास्तव में इस सवाल के साथ कुछ भी नहीं है। – jrockway

13

आप मॉड्यूल और ऑब्जेक्ट्स को संभालने के लिए कई अलग-अलग तरीकों को स्वीकार कर रहे हैं - और जो काम नहीं करता है उसके साथ समाप्त हो रहा है।

1/मेरे :: मॉड्यूल एक पुस्तकालय है:

यहाँ चार दृष्टिकोण है कि काम कर रहे हैं। ट्रिम निर्यात नहीं किया जाता है।

$ cat My/Module.pm 
package My::Module; 

use strict; 
use warnings; 

sub trim { 
    my $str = shift; 

    $str =~ s{ \A \s+ }{}xms; # remove space from front of string 
    $str =~ s{ \s+ \z }{}xms; # remove space from end of string 
    return $str; 
} 

1; 
$ cat test 
#!/usr/bin/perl 

use strict; 
use warnings; 

use My::Module; 

# Note: No $ and :: not -> 
print My::Module::trim(" \t hello world\t \t"); 

2/मेरा :: मॉड्यूल एक पुस्तकालय है। ट्रिम निर्यात किया जाता है।

$ cat My/Module.pm 
package My::Module; 

use strict; 
use warnings; 

use Exporter; 
our @ISA = qw(Exporter); 
our @EXPORT = qw(trim); 

sub trim { 
    my $str = shift; 

    $str =~ s{ \A \s+ }{}xms; # remove space from front of string 
    $str =~ s{ \s+ \z }{}xms; # remove space from end of string 
    return $str; 
} 

1; 
$ cat test 
#!/usr/bin/perl 

use strict; 
use warnings; 

use My::Module; 

print trim(" \t hello world\t \t"); 

3/MyModule एक वर्ग है। ट्रिम एक वर्ग विधि है।

$ cat My/Module.pm 
package My::Module; 

use strict; 
use warnings; 

sub trim { 
    # Note class name passed as first argument 
    my $class = shift; 
    my $str = shift; 

    $str =~ s{ \A \s+ }{}xms; # remove space from front of string 
    $str =~ s{ \s+ \z }{}xms; # remove space from end of string 
    return $str; 
} 

1; 
$ cat test 
#!/usr/bin/perl 

use strict; 
use warnings; 

use My::Module; 

# Note: Not $ and -> not :: 
print My::Module->trim(" \t hello world\t \t"); 

4/MyModule एक वर्ग है, ट्रिम एक ऑब्जेक्ट विधि है।

$ cat My/Module.pm 
package My::Module; 

use strict; 
use warnings; 

# Need a constructor (but this one does nothing useful) 
sub new { 
    my $class = shift; 

    return bless {}, $class; 
} 

sub trim { 
    # Note: Object method is passed an object (which is ignored here) 
    my $self = shift; 
    my $str = shift; 

    $str =~ s{ \A \s+ }{}xms; # remove space from front of string 
    $str =~ s{ \s+ \z }{}xms; # remove space from end of string 
    return $str; 
} 

1; 
$ cat test 
#!/usr/bin/perl 

use strict; 
use warnings; 

use My::Module; 

my $trimmer = My::Module->new; 

print $trimmer->trim(" \t hello world\t \t"); 

मुझे लगता है कि आप विकल्प 1. इस मामले में के लिए कोशिश कर रहे थे, मुझे लगता है कि मैं विकल्प 2.

की सलाह देते हैं और अपने अंतिम सवाल का जवाब देने। आपको वह त्रुटि मिल रही है क्योंकि आप एक चर ($ My :: मॉड्यूल) पर एक विधि को कॉल करने का प्रयास कर रहे हैं जो अपरिभाषित है।

संबंधित मुद्दे