2010-07-08 9 views
6

मैं अपने आप को खोजने हूँ बार-बार लिखने और कोड की निम्न प्रकार पुनर्लेखन:क्या कोई डिफॉल्ट कॉन्फ़िगरेशन के साथ एक डिफ़ॉल्ट कॉन्फ़िगरेशन से ऑब्जेक्ट सेट अप करने के लिए कोई पर्ल मॉड्यूल है?

my %default = (x => "a", y => "b"); 
sub new 
{ 
     my ($package, $config) = @_; 
     my $self = {%default}; 
     for my $k (keys %default) { 
      $self->{$k} = $config->{$k} if defined $config->{$k}; 
     } 
     for my $k (keys %$config) { 
      if (! exists $default{$k}) { 
       carp "Unknown config option $k\n"; 
      } 
     } 
     bless $self; 
     # etc. etc. 
} 

इससे पहले कि मैं अपने ही मॉड्यूल यह करने के लिए बनाने के लिए, मैं सिर्फ अगर वहाँ इस तरह पहले से ही कुछ भी है CPAN पर सोच रहा था? मैं बस कार्यक्षमता के ऊपर यह बहुत आसान चाहता हूं, इसलिए मूस का उपयोग करने का सुझाव इस प्रश्न का उपयुक्त उत्तर नहीं है।

उत्तर

4

Params::Validate कुछ मदद की हो सकती है। यह आपको %defaults हैश ड्रॉप करने और प्रत्येक (संभवतः वैकल्पिक) पैरामीटर के लिए डिफ़ॉल्ट निर्दिष्ट करने की अनुमति देगा।

इसके अतिरिक्त, आप map का उपयोग कर थोड़ा कम वर्बोज़ बना सकते हैं। बेशक, यह चुपचाप अवैध तर्कों को अनदेखा कर देगा।

#!/usr/bin/perl 

package My::Class; 

use strict; use warnings; 

my %defaults = (x => 'a', y => 'b'); 

sub new { 
    my $class = shift; 
    my ($args) = @_; 

    my $self = { 
     %defaults, 
     map { 
      exists $args->{$_} ? ($_ => $args->{$_}) :() 
     } keys %defaults, 
    }; 

    return bless $self, $class; 
} 

package main; 

use strict; use warnings; 

my $x = My::Class->new({ x => 1, z => 10}); 

use YAML; 
print Dump $x; 

आउटपुट:

--- !!perl/hash:My::Class 
x: 1 
y: b
+1

ठीक है, मैं स्वीकार करता हूं कि वास्तव में कोई जवाब नहीं है, इसलिए पैराम्स :: मान्य करने का उल्लेख करने के लिए स्वीकार करें, जो मैंने पूछा है उससे निकटतम चीज़ हो सकती है। –

+0

;-) - धन्यवाद। –

11

Moose विशेषताओं के लिए चूक, जैसे समर्थन करता है:

has 'foo' => (is => 'rw', isa => 'Int', default => 42); 

लेकिन अगर आप मूस मार्ग, तुम क्या चाहते प्राप्त करने का एक सरल तरीका नीचे जाने के लिए नहीं करना चाहती है:

sub new { 
    my ($package, %config) = @_; 

    my %defaults = (x => 'a', y => 'b'); 

    my $self = { %defaults, %config }; 

    # error checking here 

    return bless $self, $package; 
} 

चूंकि हैश प्रारंभ में दो बार एक ही हैश कुंजी निर्दिष्ट करने के बाद से पहले को क्लॉबर किया जाएगा, %config में कोई भी कुंजी %defaults में उनको ओवरराइड कर देगी।

+1

दोगुनी हैश के साथ टिप के लिए धन्यवाद। मुझे निश्चित रूप से भले ही% कॉन्फ़िगरेशन में भयानक सामग्री की जांच करने की आवश्यकता है। –

+1

दोगुनी हैश चाल बहुत अच्छी लगती है और मेरे लिए काम करने लगती है, लेकिन मेरे आश्चर्य के लिए पेल्डटाटा वास्तव में यह नहीं कहता कि क्या होता है जब हैश को डुप्लिकेट कुंजी वाली एक सूची सौंपी जाती है। क्या आपके पास इसके लिए कोई दस्तावेज है? –

+3

@ यादृच्छिक, 'perlfaq4' में इसका संक्षिप्त उल्लेख है," मैं दो हैंश से अनन्य कुंजी कैसे प्राप्त कर सकता हूं? " http://perldoc.perl.org/perlfaq4.html#How-can-I-get-the-unique-keys-from-two-hashes पर? – friedo

3

यदि आप पहले से ही अपने मॉड्यूल में मूस का उपयोग कर रहे हैं, तो आप MooseX::Getopt और MooseX::SimpleConfig के संयोजन से यह व्यवहार प्राप्त कर सकते हैं। आपका कॉन्फ़िग फ़ाइल चूक शामिल कर सकते हैं, और फिर आप कुछ भी रूप में निर्माता के लिए उन मूल्यों को पारित करने के लिए आवश्यक ओवरराइड:

my $obj = Class->new_with_options(configfile => "myconfig.yaml", key1 => 'val', key2 => 'val'); 

package Class; 
use Moose; 
with 'MooseX::Getopt::Strict', 
    'MooseX::SimpleConfig'; 

has configfile => (
    is => 'ro', isa => 'Str', 
    traits => ['Getopt'], 
    documentation => 'File containing default configs', 
    lazy => 1, 
    default => sub { File::Spec->catfile($base_dir, 'my_default_config.yaml') }, 
); 

has [ qw(key1 key2) ] => (
    is => 'ro', isa => 'Str', 
); 
संबंधित मुद्दे

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