web-dev-qa-db-ja.com

Perlの印刷はデフォルトで改行をどのように追加できますか?

Perlでは、ほとんどのprintステートメントは次の形式を取ります。

print "hello." . "\n";

厄介な "\ n"が横たわるのを避ける良い方法はありますか?

自動的に\ nを追加するmyprintなどの新しい関数を作成できることは知っていますが、既存のprintをオーバーライドできると便利です。

87
Mike

Perl 6には、\nを自動的に追加するsay関数があります。

追加する場合は、Perl 5.10または5.12でsayを使用することもできます

use feature qw(say);

あなたのプログラムの始めに。または、 Modern :: Perl を使用して、この機能や他の機能を取得できます。

詳細については、 perldoc機能 を参照してください。

93
Josh Kelley

She-bangヘッダーで-lオプションを使用できます。

#!/usr/bin/Perl -l

$text = "hello";

print $text;
print $text;

出力:

hello
hello
30
jaypal singh

Perl 5.10+がオプションではない場合、ここに簡単で汚い近似があります。 sayは最初のargがハンドルの場合に魔法を持っているため、まったく同じではありませんが、STDOUTに出力するためのものです。

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

say 'hello';
24
Eric Strom

印刷文の記述方法は不必要に冗長です。改行を独自の文字列に分ける必要はありません。これで十分です。

print "hello.\n";

この実現により、おそらく一般的にコーディングが容易になります。

use feature "say"またはuse 5.10.0またはuse Modern::Perlを使用して組み込みのsay機能を取得することに加えて、pimp Perl5i をオンにしますデフォルトでは、多くの実用的なPerl 5機能が欠落しています。

19
Schwern

おそらく、出力レコードの区切り文字を次のように改行に変更したいでしょう。

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

更新:私の答えは、得策ではなく能力について語っています。行末に「\ n」を追加するのは「厄介な」雑用だとは思いませんが、誰かが本当にそれを避けたいのであれば、これは一つの方法です。この手法を使用するコードを少し維持しなければならなかった場合、おそらくリファクタリングしてプロントにしたいと思います。

9
David M

Perl 6には、 say 関数があります

3
Michael Mrozek

5.10より前のバージョンにこだわっている場合、上記のソリューションはsay関数を完全には複製しません。例えば

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

次のような呼び出しでは機能しません

say for @arr;

または

for (@arr) {
    say;
}

...上記の関数は、printおよび実際のsay関数のような暗黙のグローバル$_に作用しないためです。

Perl 5.10+ sayをより厳密に複製するには、この関数が必要です。

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

これは今このように動作します

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

Perl6のsayビルトインの動作は少し異なります。 say @arrまたは@arr.sayで呼び出すと、配列項目が連結されるだけでなく、リストセパレーターで区切られて印刷されます。これをPerl5で複製するには、次のようにします。

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

$"はグローバルリスト区切り変数です。または、English.pmを使用している場合は$LIST_SEPARATORです

これで、Perl6のように動作するようになります。

say @arr;
# OUTPUT
# alpha beta gamma
#
1
Joshua

https://perldoc.Perl.org/perlvar.html で見つけたものを次に示します。

$ \印刷演算子の出力レコード区切り文字。定義されている場合、この値はprintの最後の引数の後に出力されます。デフォルトはundefです。

静的メソッドとしてのみ、ハンドルでoutput_record_separator()を呼び出すことはできません。 IO :: Handleを参照してください。

記憶法:印刷の最後に「\ n」を追加する代わりに$ \を設定します。また、これは$ /のようなものですが、Perlから「元に戻す」ものです。

例:

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