2010-06-18 9 views
11

हो सकता है ठीक है, इसलिए मैं कुछ सामान्य कॉन्फ़िगरेशन डेटा वाले फ़ाइल में पढ़ने के लिए perl का उपयोग कर रहा हूं। यह डेटा हेडर में व्यवस्थित होता है जिसका अर्थ है कि उनका क्या मतलब है। एक उदाहरण इस प्रकार है:एक लाइन को विभाजित करने के लिए पर्ल का उपयोग करना जिसमें व्हाइटस्पेस

[vars] 

# This is how we define a variable! 
$var = 10; 
$str = "Hello thar!"; 


# This section contains flags which can be used to modify module behavior 
# All modules read this file and if they understand any of the flags, use them 
[flags] 
    Verbose =  true; # Notice the errant whitespace! 

[path] 
WinPath = default; # Keyword which loads the standard PATH as defined by the operating system. Append with additonal values. 
LinuxPath = default; 

लक्ष्य: एक उदाहरण "$ var = 10;" के रूप में पहली पंक्ति का उपयोग करना, मैं एक सरणी है कि वर्ण हैं बनाने के लिए पर्ल में विभाजित समारोह का उपयोग करना चाहते "$ वर "और" 10 "तत्वों के रूप में। एक उदाहरण के रूप में एक और लाइन का उपयोग करना:

Verbose =   true; 
    # Should become [Verbose, true] aka no whitespace is present 

यह इसलिए आवश्यक है क्योंकि मैं एक नई फ़ाइल में इन मूल्यों को (जो सी ++ कोड का एक अलग टुकड़ा पढ़ा जाएगा) वस्तुओं शब्दकोश का दृष्टांत के लिए outputting कर दिया जाएगा। बस (के रूप में मैं साथ जाने बस इसे बनाने तक) आप यह कैसा लग सकता है एक छोटा सा स्वाद देने के लिए:

define new dictionary 
name: [flags] 
# Start defining keys => values 
new key name: Verbose 
new value val: 10 
# End dictionary

ओह, और यहाँ है कोड मैं वर्तमान में यह क्या कर रहा है (गलत) के साथ है :

sub makeref($) 
{ 
    my @line = (split (/=/)); # Produces ["Verbose", " true"]; 
} 

, एक सवाल का जवाब देने कारण है कि मैं कॉन्फ़िग :: सरल उपयोग नहीं कर रहा है कि मैं मूल रूप से क्या मेरी विन्यास फाइल कैसा दिखेगा पता नहीं था, केवल क्या मैं इसे करना चाहता था है। जैसे ही मैं साथ गया, इसे कम करना - कम से कम मुझे क्या समझ में आया - और फाइल को पार्स करने के लिए पर्ल का उपयोग करना।

समस्या मैं कुछ सी ++ कोड कि कॉन्फ़िग फ़ाइल में जानकारी लोड होगा है, लेकिन C++ या सी में पार्स करने है :(मैं पर्ल उपयोग करने का फैसला के बाद से। यह भी मेरे लिए एक अच्छा सीखने व्यायाम है, क्योंकि मैं नया हूँ है भाषा के लिए। तो यह बात है, यह पर्ल कोड वास्तव में मेरे एप्लिकेशन से अलग नहीं है, यह सी ++ कोड को जानकारी पढ़ने के लिए आसान बनाता है। और, यह अधिक पठनीय है (कॉन्फ़िगरेशन फ़ाइल और जेनरेट की गई फाइल दोनों)। प्रतिक्रिया के लिए धन्यवाद, यह वास्तव में मदद की।

+1

प्रोटोटाइप का उपयोग न करें जब तक वे आवश्यक न हों। फिर भी, तीन बार सोचो। http://perldoc.perl.org/perlsub.html#Prototypes * यह सब बहुत शक्तिशाली है, और दुनिया को बेहतर स्थान बनाने के लिए केवल मॉडरेशन में ही उपयोग किया जाना चाहिए। * –

+0

कृपया एफएम का जवाब देखें। आपको वास्तव में ऐसी सामान्य और मानक नौकरी करने के लिए अपना स्वयं का फ़ाइल पार्सर नहीं लिखना चाहिए - सीपीएएन का उपयोग करें, और अपने एप्लिकेशन तर्क पर ध्यान केंद्रित करें। – Ether

उत्तर

6

आप एक सीखने व्यायाम के रूप में यह पार्स कर रहे हैं, ठीक है। हालांकि, CPAN में कई मॉड्यूल हैं जो आपके लिए बहुत काम करेंगे।

use Config::Simple; 
Config::Simple->import_from('some_config_file.txt', \my %conf); 
+0

हाँ, मुझे सचमुच पूछना है कि ओपी मानक कॉन्फ़िगरेशन फ़ाइल प्रारूप के समान क्यों है, लेकिन मानक कॉन्फ़िगरेशन फ़ाइल रीडर मॉड्यूल का उपयोग नहीं कर रहा है जो आसानी से उपलब्ध हैं और बहुत अच्छी तरह से परीक्षण किए गए हैं। (वाईएएमएल यह देखने के लिए एक और अच्छा है कि कॉन्फ़िगर :: सरल वांछित प्रारूप से मेल नहीं खाता है।) – Ether

+0

95% समय यह वही होगा जो वांछित होगा। मेरे पास कुछ कारण हैं (सीखना, मेरा पूरा कोड पर्ल में नहीं है) जो इसे अलग-अलग करना आसान बनाता है। –

2

लगता है जैसे आप यह मिल गया है। बंटवारे से पहले व्हाइटस्पेस पट्टी।

sub makeref($) 
{ 
    s/\s+//g; 
    my @line = (split(/=/)); # gets ["verbose", "true"] 
} 
+0

अहह अब इतना स्पष्ट है। धन्यवाद, मैं perl के लिए नया हूँ और यह वास्तव में एक अच्छी भाषा है। –

+0

आपका स्वागत है। आशा करता हूँ की ये काम करेगा। –

+0

विचित्र रूप से, chomp whitespaces chomp नहीं है! –

1

यह कोड चाल करता है (और उलट के बिना अधिक कुशल है)। एक रेगुलर एक्सप्रेशन पर

for (@line) { 
    s/^\s+//; 
    s/\s+$//; 
} 
+0

आप एक से अधिक अतिरिक्त व्हाइटस्पेस उपस्थिति को प्रतिस्थापित करने के लिए रेगेक्स के अंत में 'g' जोड़ सकते हैं। यानी '^/s \ // g;' –

+0

कृपया गड़बड़ सिंटैक्स हाइलाइटिंग नोट करें। – Svante

+0

कई मॉड्यूल हैं जो सीपीएएन पर कॉन्फ़िगरेशन सेक्शन, निरंतरता लाइन, एकाधिक मान आदि वाले चर आदि को संभालते हैं। एक बार सीखने के बाद उनमें से एक का प्रयोग करें। मुझे 'कॉन्फ़िगर :: Std' पसंद है। @ एफएम ने 'कॉन्फ़िगर :: सरल' की ओर इशारा किया। –

3

split विभाजन है, तो आप बस अपने regex में = संकेत चारों ओर खाली स्थान के रख सकते हैं:

split (/\s*=\s*/, $line); 

आप स्पष्ट रूप से सभी सफेद स्थान को निकालना नहीं चाहते हैं, या इस तरह के एक लाइन का उत्पादन किया जाएगा (स्ट्रिंग में व्हाइटसाइट स्पेस):

$str="Hellothere!"; 

मुझे लगता है कि चालू शुरुआत और पंक्ति के अंत से ly को हटाने के खाली स्थान के लिए पर्याप्त है:

$line =~ s/^\s*(.*?)\s*$/$1/; 

दो बयानों के साथ एक आसान विकल्प:

$line =~ s/^\s+//; 
$line =~ s/\s+$//; 
+0

कृपया गड़बड़ सिंटैक्स हाइलाइटिंग नोट करें। – Svante

+0

यही कारण है कि मैं एसओ पर पोस्ट करते समय '{}} {...}' का उपयोग करता हूं। –

+1

's/^ \ s + //' थोड़ा अधिक कुशल है। –

0

आप शायद यह सब पता लगा है, लेकिन मैंने सोचा कि मैं एक छोटे से जोड़ना होगा। आप

sub makeref($) 
{ 
    my @line = (split(/=/)); 
    foreach (@line) 
    { 
     s/^\s+//g; 
     s/\s+$//g; 
    } 
} 

तो आप से पहले और दोनों को छोड़ दिया और सही पक्ष के बाद सफेद स्थान को निकालना होगा। इस तरह कुछ:

this is a parameter   =  all sorts of stuff here 

में पागल रिक्त स्थान नहीं होंगे।

!! चेतावनी: मुझे शायद नहीं पता कि मैं किस बारे में बात कर रहा हूं !!

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

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