2009-11-30 11 views
11

Varsayılan olarak, win32 ortamında perl \ r \ n yazdırır. Bunu nasıl geçersiz kılabilirim? Bir depodaki bazı kaynak kodlarında bazı değişiklikler yapmak için perl kullanıyorum ve tüm yeni satır karakterlerini değiştirmek istemiyorum.Win32 üzerinde Perl'de bir unix newline'ı nasıl yazdırabilirim?

Çıkış kayıt ayırıcısını değiştirmeyi denedim, ancak şanssız.

Teşekkürler!

Düzenleme: bir kod örneği içerecek şekilde Wanted - Bir arama yapıyorum ve böyle nispeten basit bir modeli takip bazı dosyaları üzerinde değiştirin: Bu "herhangi örneklerini değiştirmek gerekir

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

use strict; 
use warnings; 

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

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

    } 
    print; 
} 

merhaba cmd satırında geçen tüm dosyalar için "with" world ".

Düzenleme 2: Herhangi bir şans başlangıçta olmadan önerdiği gibi Ben binmode çalıştı. Biraz daha fazla inceledim ve $^I (inplace özel değişkeni düzenle) öğesinin binmode'u geçersiz kıldığını gördüm. Herkese yerinde düzenleme yapmak için herhangi bir iş var mı?

Düzenleme 3: Sinan aşağıda işaret gibi benim örnekte $^I yerine binmode STDOUT ile binmode ARGVOUT kullanmak gerekiyordu. Teşekkürler.

+2

Çıkış kayıt ayırıcısını değiştirdiyseniz, yapabileceğiniz tek şey buydu. Sanırım başka bir hata yaptınız (aslında gelen satırları doğru bir şekilde bölmeksizin ya da onları ezmemek gibi). –

+0

Bunu istemediğinizde '\ r \ n' yazdıran bir kod örneği verebilir misiniz? – Ether

+0

@Sinan, neden isteksiz olduğumu varsayalım? Ben isteksiz değilim. Elimde kısa bir senaryo yok. Muhtemelen çok fazla mantıklı olmayacak ve daha da kafa karıştırıcı olabilecek çok uzun ve karmaşık bir senaryom var. Bu gece daha sonra kısaltılmış bir versiyon yapabilirim. İlgili bölümleri dahil ettiğimi düşündüm. Düzenlemenin o tarihte alakalı olduğunu bilmiyordum. Teşekkürler. –

cevap

12

bir satır BESLEME karakteri, yayar, varsayılan olarak, bir CARRIAGE RETURN ("\015") bir LINE FEED ("\012") karakter, çünkü Windows'daki standart yeni satır sırası.

Eğer ( perldoc perlvar bakınız) özel dosya tanıtıcısına ARGVOUT için geçersiz kılmayı gerek böylece bu, şeffaf olur

:

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

use strict; use warnings; 

local ($\, $/); 

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

Çıktı:

 
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.. 

Ayrıca bkz perldoc open, perldoc binmode ve perldoc perliol (teşekkürler daotoad).

+5

Gerçekten de \ n bir şey yapmıyor. Çeviri dosyası 012. Yani, bir metin dosyası dosyasına yazmadan, \ n hala \ 012'dir. –

+0

@brian d foy: Açıklama ekledi. –

+2

Perl IO katmanlarının ayrıntılı bir şekilde tartışılması için, bu çeviriyi yapan mekanizma, bkz. Perldoc perliol - http://perldoc.perl.org/perliol.html – daotoad

4

binmode(STDOUT) mu çalışıyor?

+0

+1, evet, kısmen ... düzenlemeye bakın. Teşekkürler. –

0

Bir unix satır ardından Windows üzerinde bir dosya tanıtıcısına ASCII kodu Baskı "\n" 10.

print "\012";

+1

Windows'ta: "perl -e" print qq {\ 012} "| binxde 'STDOUT' ayarlanmadıkça xxd' 0000000: 0d0a' değerini verir. –

+1

Doğru karakteri almakta sorun değil. Bir metin dosyası dosyasına yazarken çıktıyı değiştiren metin modu çevirisi. –

+0

Windows'da beni düzeltdiğiniz için teşekkürler; Ne yapacağımı açıkça söylediğinde bile, perl'i "yardım etti" diye unutmuştum. –

0

Okuduğunuz veriler satır sonlarını içerdiğinden, bunları tekrar geri alıyorsunuz.Sen Sinan'ın olarak tanımladığı :: Eğer binmode set olmaları kaydıyla, sonra tekrar kendi sonunu ekleyin chomp ile kendinizi onlara kapalı şerit olabilir

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

Re: $^I yeni çıktı kolunu açtığında binmode hakkında sorun kaybolması, Eğer open pragma ile bu çözebilir: ': ham' bunlara uygulamak (hiçbir argüman ile binmode eşdeğer) PerlIO tabakası tüm filehandles zorlar

use open OUT => ':raw'; 

olması yazmak için açıldı. no'lu no'lu herhangi bir şey açıyorsanız, :crlf ya da gerektiğinde başka bir katman uyguladığınız çıktıya dikkat edin.