2010-02-18 12 views
5

मैं हेक्साडेसिमल संख्याओं के रूप में एन्कोड किया गया ASCII वर्णों की एक लाइन (उदाहरण के लिए लाइन 48 54 54 50HTTP के रूप में डीकोड किया जाना चाहिए) को डिकोड करने के लिए एक पर्ल एक लाइनर लिखने के लिए करना चाहते हैं। मैं इसके साथ आया:हेक्स में एन्कोडेड ASCII स्ट्रिंग को डीकोड करने के लिए मैं पर्ल वन-लाइनर का उपयोग कैसे कर सकता हूं?

perl -nE 'say map(chr, map { qq/0x$_/ } split)' 

यह एक खाली रेखा प्रिंट करता है। मैं गलत क्या कर रहा हूं और आप इसे कैसे लिखेंगे?

+1

'पर्ल -lnE 'y/// घ; पैक "एच *", $ _ '' – hobbs

उत्तर

6

यह अपने qq/0x$_/ चाल वह काम नहीं करता है। chr तर्क के रूप में एक संख्या की अपेक्षा करता है, लेकिन स्ट्रिंग अक्षर "0x48" मिलता है। फ़ंक्शन को 48 को दशमलव संख्या में बदलने के लिए hex फ़ंक्शन का उपयोग करें, जैसे datageisthis answer में करता है।

यह मेरे लिए काम करता है:

echo '48 54 54 50' | perl -nE 'say map(chr, map { hex } split)' 
+1

एक-लाइनर में यह केवल '-E' के साथ काम करता है (जैसा कि' -e' के विपरीत) है, लेकिन मुझे लगता है कि आप पहले ही इसे समझ चुके हैं। निश्चित रूप से 'प्रिंट' $ _ \ n "' धड़कता है। – zoul

+0

इसे इंगित करने के लिए धन्यवाद, मुझे वापस जाना था और उस समय एक बार फिर से पढ़ना पड़ा: डी –

+1

आपका 'नक्शा()' 'देखो' बेहद असंगत है। क्या नक्शा (सीआर, मानचित्र (हेक्स, विभाजन)) के साथ कुछ भी गलत है? –

6

यह काम करता है:

echo '48 54 54 50' | perl -nE 'say map{chr(hex)} split' 

मैं यह सोचते करती हूं कि आप stdin से डेटा को खिलाने के लिए चाहते हैं।

+0

धन्यवाद, धन्यवाद, मुझे' हेक्स' नहीं पता था। – zoul

+0

आपका स्वागत है। पोस्ट पर स्वरूपण को ठीक करने के लिए धन्यवाद। :) – datageist

3

प्ले perlgolf?

-ple y/0-9A-Fa-f//cd;$_=pack"H*",$_ 
-ple $_=pack"H*",$_,join"",split 
-nE say map chr hex,split 
-naE say map chr hex,@F 
6

हमेशा की पर्ल TIMTOWTDI साथ।

मैंने सोचा कि मैं कई विकल्प प्रस्तुत होता है, और वे क्या की तरह अगर वे सामान्य रूप से लिखा गया था लगेगा दिखा। यदि आप कमांड लाइन विकल्प perldoc perlrun के बारे में और जानना चाहते हैं तो एक उपयोगी संसाधन है।


ये सब एक ही चीज़ आउटपुट करते हैं। अपवाद के साथ कि उनमें से कुछ अंत में एक नई लाइन मुद्रित नहीं करते हैं।

echo '48 54 54 50' | perl -0x20 -pe'$_=chr hex$_' 
echo '48 54 54 50' | perl -0x20 -ne'print chr hex$_' 
echo '48 54 54 50' | perl -0777 -anE'say map chr,map hex,@F' 
echo '48 54 54 50' | perl -0777 -anE'say map{chr hex$_}@F' 
echo '48 54 54 50' | perl -0apple'$_=chr hex$_' -0x20 
echo '48 54 54 50' | perl -apple'$_=join"",map{chr hex}@F' 
echo '48 54 54 50' | perl -lanE'say map{chr hex}@F' 

निम्नलिखित उदाहरणों में से कुछ उदाहरण देखेंगे कि वे सामान्य रूप से लिखे गए थे। यदि आप यह जानना चाहते हैं कि उनमें से बाकी क्या करते हैं, तो निश्चित रूप से perldoc perlrun देखें।


perl -0x20 -pe'$_=chr hex$_' 

यह एक काफी सीधे आगे है। यह शायद यहां सबसे अच्छा उदाहरण है, और यह भी सबसे छोटा है। यह दिखाता है कि रिक्त स्थान लाइनों को अलग करने के लिए उपयोग किए जाते हैं, ताकि लूप के अंदर से निपटने के लिए केवल एक ही अक्षर हो।

# perl -0x20 -pe'$_=chr hex$_' 
$/ = " "; # -0 (input separator) 
while(<>){ 
    $_ = chr hex $_; 
} continue { 
    print $_; 
} 

perl -0apple'$_=chr hex$_' -0x20 

यह एक कुछ कमांड लाइन विकल्पों को कुछ भी उपयोगी नहीं करते है।

  • पहले -0 विकल्प ताकि -l रिक्त स्ट्रिंग पर उत्पादन विभाजक सेट करता है। जो वास्तव में आउटपुट विभाजक के लिए डिफ़ॉल्ट है।
  • दो -p विकल्प हैं जहां कोई पर्याप्त होगा।
  • -a विकल्प @F सरणी सेट है, लेकिन हम वास्तव में यह प्रयोग नहीं करते।

मूल रूप से मैं -a-l और एक दूसरे -p इस्तेमाल किया ताकि विकल्पों सेब वर्तनी होगा। अन्यथा यह अंतिम उदाहरण के समान है।

echo '48 54 54 50' | perl -0x20 -pe'$_=chr hex$_' 
# perl -0apple'$_=chr hex$_' -0x20 
$/ = ""; # -0 (input separator) 
$\ = $/; # -l (output separator) 
$/ = " "; # -0x20 (input separator) 
while(<>){ 
    @F = split " ", $_; # -a (unused) 
    $_ = chr hex $_; 
} continue { 
    print $_; 
} 

perl -lanE'say map{chr hex}@F' 

मैं सोचा मैं पहले से ही वर्तनी सेब, मैं भी लेन वर्तनी हो सकता है।

  • -l क्योंकि हम पहले say उपयोग कर रहे हैं, वास्तव में उपयोगी नहीं है। ताकि हम say इस्तेमाल कर सकते हैं
  • प्रयुक्त -E बजाय -e
# perl -lanE'say map{chr hex}@F' 
$\ = $/; # -l (output separator set to "\n") 
while(<>){ 
    @F = split " ", $_; # -a 
    say map { chr hex $_ } @F; 
} 
संबंधित मुद्दे

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