Perlでは、ほとんどのprint
ステートメントは次の形式を取ります。
print "hello." . "\n";
厄介な "\ n"が横たわるのを避ける良い方法はありますか?
自動的に\ nを追加するmyprint
などの新しい関数を作成できることは知っていますが、既存のprint
をオーバーライドできると便利です。
Perl 6には、\n
を自動的に追加するsay
関数があります。
追加する場合は、Perl 5.10または5.12でsay
を使用することもできます
use feature qw(say);
あなたのプログラムの始めに。または、 Modern :: Perl を使用して、この機能や他の機能を取得できます。
詳細については、 perldoc機能 を参照してください。
She-bangヘッダーで-l
オプションを使用できます。
#!/usr/bin/Perl -l
$text = "hello";
print $text;
print $text;
出力:
hello
hello
Perl 5.10+がオプションではない場合、ここに簡単で汚い近似があります。 sayは最初のargがハンドルの場合に魔法を持っているため、まったく同じではありませんが、STDOUTに出力するためのものです。
sub say {print @_, "\n"}
say 'hello';
印刷文の記述方法は不必要に冗長です。改行を独自の文字列に分ける必要はありません。これで十分です。
print "hello.\n";
この実現により、おそらく一般的にコーディングが容易になります。
use feature "say"
またはuse 5.10.0
またはuse Modern::Perl
を使用して組み込みのsay
機能を取得することに加えて、pimp Perl5i をオンにしますデフォルトでは、多くの実用的なPerl 5機能が欠落しています。
おそらく、出力レコードの区切り文字を次のように改行に変更したいでしょう。
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」を追加するのは「厄介な」雑用だとは思いませんが、誰かが本当にそれを避けたいのであれば、これは一つの方法です。この手法を使用するコードを少し維持しなければならなかった場合、おそらくリファクタリングしてプロントにしたいと思います。
Perl 6には、 say
関数があります
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
#
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";