2017-07-23 7 views
7

के अंदर एक्सएमएल ट्विग को पुर्ज करें मैं XML::Twig के साथ बड़ी एक्सएमएल फाइलों (60 जीबी +) को पार्स कर रहा हूं और इसे ओओ (मूस) स्क्रिप्ट में उपयोग कर रहा हूं। जैसे ही वे स्मृति में पढ़े जाते हैं, तत्वों को पार्स करने के लिए मैं twig_handlers विकल्प का उपयोग कर रहा हूं। हालांकि, मुझे यकीन नहीं है कि मैं एलिमेंट और ट्विग से कैसे निपट सकता हूं।उप हैंडलर

इससे पहले कि मैं मूस (और OO कुल मिलाकर) का इस्तेमाल किया, मेरी स्क्रिप्ट के रूप में निम्नानुसार देखा (और काम):

my $twig = XML::Twig->new(
    twig_handlers => { 
    $outer_tag => \&_process_tree, 
    } 
); 
$twig->parsefile($input_file); 


sub _process_tree { 
    my ($fulltwig, $twig) = @_; 

    $twig->cut; 
    $fulltwig->purge; 
    # Do stuff with twig 
} 

और अब मैं इसे इस तरह करना चाहते हैं।

my $twig = XML::Twig->new(
    twig_handlers => { 
    $self->outer_tag => sub { 
     $self->_process_tree($_); 
    } 
    } 
); 
$twig->parsefile($self->input_file); 

sub _process_tree { 
    my ($self, $twig) = @_; 

    $twig->cut; 
    # Do stuff with twig 
    # But now the 'full twig' is not purged 
} 

बात मैं अब देखते हैं कि कि मैं fulltwig का शुद्धिकरण याद आ रही है। मैंने सोचा कि - पहले, गैर-ओओ संस्करण - शुद्ध करने से स्मृति को बचाने में मदद मिलेगी: जितनी जल्दी हो सके पूर्णतया से छुटकारा पाएं। हालांकि, जब OO का उपयोग कर (और एक स्पष्ट sub{} हैंडलर के अंदर पर भरोसा करने वाले) मैं नहीं दिख रहा है कि कैसे मैं पूरी टहनी सफाई कर सकते हैं क्योंकि प्रलेखन का कहना है कि

$ _ भी तत्व के लिए सेट है, तो यह की तरह

para => sub { $_->set_tag('p'); }

तो वे तत्व आप कार्रवाई करने के लिए चाहते हैं के बारे में बात इनलाइन संचालकों लिखने के आसान है, लेकिन fulltwig नहीं ही। तो अगर मैं subroutine को पारित नहीं किया जाता है तो मैं इसे कैसे हटा सकता हूं?

उत्तर

6

हैंडलर अभी भी पूर्ण जुड़वां हो जाता है, आप इसका उपयोग नहीं कर रहे हैं (इसके बजाय $ _ का उपयोग कर रहे हैं)।

यह पता चला है के रूप में आप अभी भी (डॉक्स में जो मैं आमतौर पर "तत्व" कॉल करें, या elt) टहनी पर purge कॉल कर सकते हैं: $_->purge काम करेंगे के रूप में उम्मीद, $ में वर्तमान तत्व तक पूर्ण टहनी के शुद्धिकरण _ ;

एक क्लीनर (IMHO) जिस तरह से वास्तव में मानकों के सभी मिलता है और expicitely पूर्ण टहनी शुद्ध करने के लिए किया जाएगा:

my $twig = XML::Twig->new(
    twig_handlers => { 
    $self->outer_tag => sub { 
     $self->_process_tree(@_); # pass _all_ of the arguments 
    } 
    } 
); 
$twig->parsefile($self->input_file); 

sub _process_tree { 
    my ($self, $full_twig, $twig) = @_; # now you see them! 

    $twig->cut; 
    # Do stuff with twig 
    $full_twig->purge; # now you don't 
} 
+0

आह, मेरा बुरा! क्या चल रहा था यह देखने के लिए मुझे '@ _' का निरीक्षण करना चाहिए था। धन्यवाद! क्या आप केवल पूर्ण टहनियों को शुद्ध करने के लिए कोई नकारात्मक/उल्टा है * * के बाद * आपने कट टिग के साथ सामान किया है? मेरा तर्क * तत्व * को काटने के तुरंत बाद इसे शुद्ध करना था, ताकि स्मृति जितनी जल्दी हो सके साफ़ हो जाए। मैं गलत हो सकता हूं? रास्ते में महान मॉड्यूल, हम इसे ** सभी ** समय का उपयोग करें! –

+1

जब आप शुद्ध करते हैं तो इसे कोई फर्क नहीं पड़ता है। सबसे महत्वपूर्ण बात यह है कि आप अगले उपट्री को पार्स करना शुरू करने से पहले स्मृति को पुनः प्राप्त करना सबसे महत्वपूर्ण है। और धन्यवाद; -) – mirod

+1

यह करी मॉड्यूल के लिए भी एक अच्छा उपयोग मामला होगा। – simbabque