2009-11-30 10 views
11

डिफ़ॉल्ट रूप से, एक Win32 वातावरण में perl प्रिंट \ r \ n प्रिंट करता है। मैं इसे कैसे ओवरराइड कर सकता हूं? मैं एक स्रोत में कुछ स्रोत कोड में कुछ बदलाव करने के लिए perl का उपयोग कर रहा हूं, और मैं सभी नए अक्षरों को बदलना नहीं चाहता हूं।मैं Win32 पर पर्ल में सिर्फ एक यूनिक्स न्यूलाइन कैसे प्रिंट कर सकता हूं?

मैंने आउटपुट रिकॉर्ड विभाजक बदलने की कोशिश की लेकिन बिना किसी किस्मत के।

धन्यवाद!

संपादित करें: एक कोड नमूना शामिल करने के लिए चाहता था - मैं एक खोज कर रहा हूँ और कुछ फ़ाइलों है कि इस तरह एक अपेक्षाकृत सरल पैटर्न का पालन अधिक बदल देते हैं:

#!/usr/bin/perl 
# test.pl 

use strict; 
use warnings; 

$/ = undef; 
$\ = "\n"; 
$^I=".old~"; 

while (<>) { 
    while (s/hello/world/) { 

    } 
    print; 
} 

यह "से किसी उदाहरण बदलना चाहिए नमस्ते cmd लाइन पर पारित किसी भी फाइल के लिए "दुनिया" के साथ।

संपादित करें 2: रूप में किसी भी भाग्य शुरू में बिना सुझाव दिया मैं binmode की कोशिश की। मैंने कुछ और पाया और पाया कि $^I (इनस्थल विशेष चर संपादित करें) binmode ओवरराइड कर रहा था। अभी भी इनस्थल संपादन का उपयोग करने में सक्षम होने के लिए कोई भी काम?

संपादित करें 3: सिनान नीचे बताते हैं के रूप में, मैं अपने उदाहरण में $^I बजाय binmode STDOUT साथ binmode ARGVOUT उपयोग करने के लिए की जरूरत है। धन्यवाद।

+2

यदि आपने आउटपुट रिकॉर्ड विभाजक बदल दिया है, तो यही वह चीज थी जो आप कर सकते हैं। मुझे लगता है कि आपने कुछ और गलती की है (जैसे वास्तव में इनकमिंग लाइनों को सही ढंग से विभाजित नहीं करना, या उन्हें चूमना नहीं)। –

+0

क्या आप कुछ कोड का उदाहरण दे सकते हैं जो प्रिंट नहीं करते हैं \ r \ n' जब आप इसे नहीं चाहते हैं? – Ether

+0

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

उत्तर

12

है ASCII कोड मुद्रण "\n" विंडोज पर एक filehandle करने का उत्सर्जन करता है, डिफ़ॉल्ट रूप से, एक CARRIAGE RETURN ("\015") द्वारा पीछा किया है एक LINE FEED ("\012") चरित्र क्योंकि विंडोज पर मानक न्यूलाइन अनुक्रम।

यह पारदर्शी रूप से होता है, तो आप (perldoc perlvar देखें) विशेष filehandle ARGVOUT के लिए इसे ओवरराइड करने की जरूरत है:

#!/usr/bin/perl -i.bak 

use strict; use warnings; 

local ($\, $/); 

while (<>) { 
    binmode ARGVOUT; 
    print; 
} 

आउटपुट:

 
C:\Temp> xxd test.txt 
0000000: 7465 7374 0d0a 0d0a      test.... 

C:\Temp> h test.txt 

C:\Temp> xxd test.txt 
0000000: 7465 7374 0a0a       test.. 

भी देखें perldoc open, perldoc binmode और perldoc perliol (धन्यवाद daotoad)।

+5

यह वास्तव में \ n कुछ भी नहीं कर रहा है। यह फ़ाइल हैंडल अनुवाद \ 012 है। यही है, एक पाठ फ़ाइल के लिए लिखने के बिना, \ n अभी भी \ 012 है। –

+0

@brian डी फोय: स्पष्टीकरण जोड़ा गया। –

+2

पर्ल आईओ परतों की विस्तृत चर्चा के लिए, यह अनुवाद जो तंत्र करता है, देखें perldoc perliol - http://perldoc.perl.org/perliol.html – daotoad

4

binmode(STDOUT) काम करता है?

+0

+1, हां, आंशिक रूप से ... संपादन देखें। धन्यवाद। –

0

एक यूनिक्स न्यू लाइन एक linefeed चरित्र है, जो 10.

print "\012";

+1

विंडोज़ पर: 'perl -e "प्रिंट qq {\ 012}" | xxd' उपज '0000000: 0d0a' जब तक आप 'binmode STDOUT' सेट नहीं करते हैं। –

+1

सही चरित्र प्राप्त करने में कोई समस्या नहीं है। यह टेक्स्ट-मोड अनुवाद है जो टेक्स्ट फ़ाइलहेडल पर लिखते समय आउटपुट को संशोधित कर रहा है। –

+0

विंडोज़ पर मुझे सही करने के लिए धन्यवाद; मैं भूल गया था कि पर्ले ने "मदद की" तब भी स्पष्ट रूप से बताया कि क्या करना है। –

0

आपके द्वारा पढ़े जा रहे डेटा में लाइन अंत होते हैं, इसलिए आप उन्हें फिर से वापस ले रहे हैं।आप उन्हें, chomp के साथ खुद को बंद पट्टी कर सकते हैं तो अपने स्वयं के समाप्त होने के वापस जोड़ने के लिए, आप binmode की स्थापना की है, बशर्ते रूप सिनान का वर्णन करता है ::

while (<>) { 
    binmode; 
    chomp;  # strip off \r\n 
    while (s/search/replace/) { 
     # ... 
    } 
    print; 
    print "\n"; # add your own line ending back 
} 
1

पुन: binmode बारे में अपने प्रश्न खो दिया जा रहा है जब $^I खोलता है एक नया उत्पादन संभाल, आप open pragma के साथ इस का समाधान कर सकता: ': कच्चे' PerlIO परत (कोई तर्क के साथ binmode के बराबर) उन्हें लागू करने के लिए

use open OUT => ':raw'; 

जो सभी filehandles बाध्य करेगा करने के लिए लिखने के लिए खोला गया। यदि आप :crlf या आवश्यकतानुसार किसी भी अन्य परत को लागू करने के लिए अन्य खोलने के लिए कुछ भी ख्याल रखते हैं तो बस ध्यान रखें।

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

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