Perl'in baskısı varsayılan olarak nasıl yeni satır ekleyebilir?


96

Perl'de printifadelerimin çoğu formu alıyor

print "hello." . "\n";

Tüm sinir bozucu "\ n" ların ortalıkta dolaşmasını önlemenin güzel bir yolu var mı?

myprintOtomatik olarak eklenen \ n gibi yeni bir işlev yapabileceğimi biliyorum , ancak mevcut olanı geçersiz kılabilirsem iyi olur print.


10
Cevabınız $ \ içeriyorsa, lütfen görünmez etkiye sahip genel değişkenlerin ayarlanmasıyla ilgili bir uyarı listesiyle birlikte geldiğinden emin olun. Çok zekice ve teknik olarak soruyu cevaplarken, aynı zamanda bir acemiye vasıfsız olarak teslim edilmesi çok tehlikelidir.
Schwern

1
perldoc perlvaruyarıların çoğunu açıklıyor, neden onları burada özetliyor?
David M

5
@David, çünkü rastgele bir hacker cevapları perldoc yerine burada google'da aratacak, onlardan tatmin olacak ve uyarıları bile bilmeyecek!
P Shved

2
Bu, ütümün giyerken kıyafetleri ütülememem gerektiğini belirten bir uyarı etiketine sahip olmasına neden olan tuhaf bir mantıktır.
David M

8
Gerçek yaşam araçlarının, hayatlarını fiziksel dünyada yaşamış kişiler tarafından makul ölçüde iyi anlaşılan fiziksel sınırlamaları vardır. Yazılım araçları, bu tür sınırlamalara bağlı değildir ve herhangi bir kural yoktur. Her şeyi yapabilirler ve özellikle makul beklentilerin sınırlarını henüz öğrenmemiş yeni başlayanlar için sıklıkla beklentilerin dışında davranırlar.
Ether

Yanıtlar:


101

Perl 6, sayotomatik olarak eklenen bir işleve sahiptir \n.

sayEklerseniz Perl 5.10 veya 5.12'de de kullanabilirsiniz .

use feature qw(say);

programınızın başlangıcına. Veya bunu ve diğer özellikleri almak için Modern :: Perl'i kullanabilirsiniz .

Daha fazla ayrıntı için perldoc özelliğine bakın.


7
Aslında, yapmanız gereken tek şey use 5.012;ya use 5.010;da daha yeni olanları çalıştırıyorsanız onu elde etmektir perl.
Robert P

Perl 6'dan özellikle bahsedilmedikçe sorunun Perl 5'e atıfta bulunduğunu varsaymak güvenli değil mi?
wobbily_col

37

-lShe-bang başlığındaki seçeneği kullanabilirsiniz :

#!/usr/bin/perl -l

$text = "hello";

print $text;
print $text;

Çıktı:

hello
hello

3
Çok hoş. perlNe -lyapıldığı da dahil olmak üzere seçenekler hakkında daha fazla bilgi burada .
ruffin

2
Küresel olduğu için, tek satırlık metinler ve en küçük komut dosyaları dışında her şeyde kötü bir uygulamadır.
Schwern

24

Perl 5.10+ bir seçenek değilse, işte hızlı ve kirli bir yaklaşım. Tam olarak aynı değildir, çünkü ilk argümanı bir tutamaç olduğunda biraz sihir vardır, ancak STDOUT'a yazdırmak için:

sub say {print @_, "\n"}

say 'hello';

20

Print ifadenizi yazma şekliniz gereksiz yere ayrıntılıdır. Satırsonunu kendi dizesine ayırmaya gerek yoktur. Bu yeterlidir.

print "hello.\n";

Bu farkındalık muhtemelen kodlamanızı genel olarak kolaylaştıracaktır.

Kullanmanın yanı sıra use feature "say"ya use 5.10.0ya use Modern::Perlinşa almak için sayözelliği, ben pezevenk gidiyorum perl5i varsayılan olarak mantıklı eksik Perl 5 özellikleri bir sürü hangi dönüşler.


10

Belki çıktı kaydı ayırıcınızı aşağıdakilerle satır beslemeye değiştirmek istersiniz:

local $\ = "\n";

$ perl -e 'print q{hello};print q{goodbye}' | od -c
0000000    h   e   l   l   o   g   o   o   d   b   y   e                
0000014
$ perl -e '$\ = qq{\n}; print q{hello};print q{goodbye}' | od -c
0000000    h   e   l   l   o  \n   g   o   o   d   b   y   e  \n        
0000016

Güncelleme: Cevabım tavsiye edilebilirlikten çok kabiliyetten bahsediyor. Satırların sonuna "\ n" eklemeyi "sinir bozucu" bir angarya olarak görmüyorum, ancak biri gerçekten onlardan kaçınmak istiyorsa, bu bir yoldur. Bu tekniği kullanan bir parça kodu korumam gerekse, muhtemelen onu önceden yeniden düzenlerdim.


6
Hayır, lütfen bunu yapma. Teknik olarak doğru bir cevap olsa da, bu kadar önemsiz bir şey için özel bir değişken kullanmak, yolun aşağısında bir bakım yüküdür.
tsee

1
@tsee Aslında tamamen katılıyorum. Cevabımı belirtmek için düzenlediğimde, genel bir uygulama olarak tavsiye edilmese bile cevabım yeteneği açıklıyor.
David M

Gerçek tehlike, tüm kodun artık yeni satırlar ekleyeceği gerçeğinden kaynaklanıyor, hatta diğer insanların modüllerinde onu beklemeyen kodlar bile. "helo\r\n"Şimdi gönderen mesajı gönderen ağ kodunu hayal edin "helo\r\n\n".
Chas. Owens

Elbette, diğer kodları etkilemekten kaçınmak için her zaman yerel yapabilirsiniz, ancak yine de alt yordamınızın biraz daha temiz görünmesini istiyorsanız:local $\ = "\n";
redbmk

Komut bayrağını kullanmak, komut -lsatırı tek satırlılar için harikadır (bkz. Perldoc.perl.org/perlrun.html#Command-Switches ). Bunu daha büyük bir programda tavsiye etmem.
djd

4

İşte https://perldoc.perl.org/perlvar.html adresinde bulduklarım :

$ \ Yazdırma operatörü için çıktı kaydı ayırıcısı. Tanımlanırsa, bu değer yazdırmanın son bağımsız değişkenlerinden sonra yazdırılır. Varsayılan tanımsızdır.

Bir tutamaç üzerinde output_record_separator () 'u yalnızca statik bir yöntem olarak çağıramazsınız. Bkz. IO :: Handle.

Anımsatıcı: Baskının sonuna "\ n" eklemek yerine $ \ ayarlarsınız. Ayrıca, aynı $ / gibi, ama Perl'den "geri" aldığınız şey bu.

misal:

$\ = "\n";
print "a newline will be appended to the end of this line automatically";


1

5.10 öncesi ile takıldıysanız, yukarıda sağlanan çözümler sayişlevi tam olarak kopyalamayacaktır . Örneğin

sub say { print @_, "\n"; }

Gibi çağrılarla çalışmayacak

say for @arr;

veya

for (@arr) {
    say;
}

... çünkü yukarıdaki işlev örtük küresel $_benzeri printve gerçek sayişlev üzerinde hareket etmez .

Perl 5.10+ 'yi daha yakından kopyalamak için saybu işlevi istiyorsunuz

sub say {
    if (@_) { print @_, "\n"; }
    else { print $_, "\n"; }
}

Şimdi böyle davranan

my @arr = qw( alpha beta gamma );
say @arr;
# OUTPUT
# alphabetagamma
#
say for @arr;
# OUTPUT
# alpha
# beta
# gamma
#

sayPerl6 içinde yerleşik biraz farklı davranış sergileyebilir. Onu çağırmak say @arrveya @arr.saysadece dizi öğelerini birleştirmekle kalmaz, bunun yerine onları liste ayırıcıyla ayrı olarak yazdırır. Bunu perl5'te kopyalamak için bunu yaparsınız

sub say {
    if (@_) { print join($", @_) . "\n"; }
    else { print $_ . "\n"; }
}

$"genel liste ayırıcı değişkeni veya kullanıyorsanız English.pm,$LIST_SEPARATOR

Şimdi daha çok perl6 gibi davranacak.

say @arr;
# OUTPUT
# alpha beta gamma
#
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.