चर

2011-06-23 7 views
9

awk में मैं लिख सकते हैं: awk -F: 'BEGIN {OFS = FS} ...'चर

पर्ल में, FS के बराबर क्या है? मैं एक उदाहरण के साथ

perl -F: -lane 'BEGIN {$, = [what?]} ...' 

अद्यतन लिखने के लिए करना चाहते हैं:

echo a:b:c:d | awk -F: 'BEGIN {OFS = FS} {$2 = 42; print}' 
echo a:b:c:d | perl -F: -ane 'BEGIN {$, = ":"} $F[1] = 42; print @F' 

दोनों उत्पादन a:42:c:d

मैं पर्ल शुरू ब्लॉक में हार्ड कोड : नहीं करना चाहते हैं , लेकिन जहां भी -F विकल्प कहता है, उसका तर्क बचाता है।

+0

मैं अजीब से बहुत परिचित नहीं हूं ... क्या आप एक उदाहरण प्रदान कर सकते हैं जिसे आप पर्ल के साथ पूरा करने की कोशिश कर रहे हैं? मैं शायद एक अजीब-> perl सवाल से बेहतर जवाब दे सकता हूं। मैं इकट्ठा करता हूं कि ओएफएस theoutput फ़ील्ड विभाजक है (जिसे आपने सही रूप से $ के रूप में सही रूप से पहचाना है), और एफएस इनपुट है? क्षेत्र विभाजक? मुझे नहीं लगता कि पर्ल की ऐसी अवधारणा है ... हालांकि शायद विभाजित() की कार्यक्षमता समान है, हालांकि इसमें डिफ़ॉल्ट "विभाजक" नहीं है - इसे सीधे प्रदान किया जाना चाहिए। – Flimzy

+0

@Flimzy, प्रश्न –

+0

अपडेट किया गया '-F' का पैरामीटर वास्तव में एक रेगेक्स है, न कि एक शाब्दिक स्ट्रिंग, इसलिए मुझे नहीं लगता कि यह किसी भी विशेष चर से सीधे पहुंच योग्य है। – friedo

उत्तर

6

सारांश में, मैं क्या तलाश कर रहा हूँ मौजूद नहीं है:

  1. कोई चर कि -F के लिए तर्क है, और अधिक महत्वपूर्ण बात
  2. रखती है
  3. पर्ल के "एफएस" मूलरूप से एक है "ओएफएस" (स्ट्रिंग) की तुलना में अलग-अलग डेटा प्रकार (नियमित अभिव्यक्ति) - रेगेक्स का उपयोग करके तारों की सूची में शामिल होने के लिए यह समझ में नहीं आता है।

नोट है कि एक ही awk में सच है: FS एक स्ट्रिंग है लेकिन regex के रूप में कार्य:

echo a:b,c:d | awk -F'[:,]' 'BEGIN {OFS=FS} {$2=42; print}' 

आउटपुट "a[:,]42[:,]c[:,]d"

अंतर्दृष्टि और समाधान हालांकि के लिए धन्यवाद।

2

आप इनपुट की सटीक लंबाई पता हैं, तो आप ऐसा कर सकता है: इनपुट चर लंबाई की है

echo a:b:c:d | perl -F'(:)' -ane '$, = $F[1]; @F = @F[0,2,4,6]; $F[1] = 42; print @F' 

हैं, तो आप @f [0,2,4 से अधिक परिष्कृत कुछ की आवश्यकता होगी, 6]।

संपादित करें: -F बस एक स्वचालित विभाजन() कॉल में इनपुट प्रदान करता है, जो अभिव्यक्ति के रूप में एक पूर्ण आरई लेता है। विभाजन, perlre, और perlvar के लिए perldoc प्रविष्टियों को पढ़कर आप कुछ और अधिक उपयुक्त पा सकते हैं।

0

पर्ल में कोई इनपुट रिकॉर्ड विभाजक नहीं है। आप मूल रूप से -a और -F झंडे का उपयोग करके अजीब अनुकरण कर रहे हैं। यदि आप वास्तव में मूल्य को हार्ड कोड नहीं करना चाहते हैं, तो क्यों न केवल पर्यावरण चर का उपयोग करें?

$ export SPLIT=":" 
$ perl -F$SPLIT -lane 'BEGIN { $, = $ENV{SPLIT}; } ...' 
1

darnit ...

सबसे अच्छा मैं क्या कर सकते हैं:

echo a:b:c:d | perl -ne '$v=":";@F = split("$v"); $F[1] = 42; print join("$v", @F) . "\n";' 

आप -F: इस तरह की जरूरत नहीं है, और आप केवल पेट के एक बार यह कहते हुए कर रहे हैं। मैं उम्मीद कर रहा था कि कमांड लाइन पर वैरिएबल सेट करने के कुछ तरीके थे जैसे आप Awk's -v स्विच के साथ कर सकते हैं।

एक लाइनर के लिए, पर्ल आमतौर पर अवीक के रूप में साफ नहीं होता है, लेकिन मुझे पर्ल के बारे में पता था और 1000+ लाइन Awk स्क्रिप्ट लिखने से पहले मुझे Awk का उपयोग करना याद है।

इस तरह की चीजों को आजमाने की सोच में लोगों को लगता है कि जब किसी ने इस तरह की एक स्क्रिप्ट को समझने की कोशिश की थी, या एडब्ल्यूकेवर्ड के लिए खड़े हो गए तो ध्वनि को किसी भी ध्वनि के नाम पर रखा गया था।

+0

मैं मेमोरी लेन के नीचे एक यात्रा ले रहा था, और यह मुझे मारा * * * cmd लाइन से चर सेट कर सकते हैं: हैकी '-s' स्विच के साथ: 'echo a: b: c: d | perl -sne '@F = विभाजन ("$ sep"); $ एफ [1] = 42; प्रिंट में शामिल हों ("$ sep", @F)। "\ N"; ' - -sep =: ' –

1

आप की तरह क्योंकि पर्ल वास्तव में अपने -F तर्क के साथ split समारोह का उपयोग कर रहा है, यह धोखा कर सकते हैं, और आप split बता संरक्षित करने के लिए regex में कब्जा कोष्ठक शामिल करके क्या उस पर विभाजन कर सकते हैं:

$ echo a:b:c:d | perl -F'(:)' -ane 'print join("/", @F);' 
a/:/b/:/c/:/d 

आप क्या पर्ल के इन "जादू" कमांड लाइन तर्क से कुछ के साथ कर देख सकते हैं -MO=Deparse उपयोग करते हुए, इस तरह से:

$ perl -MO=Deparse -F'(:)' -ane 'print join("/", @F);' 
LINE: while (defined($_ = <ARGV>)) { 
    our(@F) = split(/(:)/, $_, 0); 
    print join('/', @F); 
} 
-e syntax OK 

आप आपको @F सब्सक्रिप्शन को सामान्य रूप से दोगुना करने के लिए बदलना होगा ($F[2] = 42)।