Perlでは、私のprint
ステートメントのほとんどが次の形式をとります
print "hello." . "\n";
すべての厄介な "\ n"を横に置いておくのを避ける良い方法はありますか?
私はmyprint
自動的に\ nを追加するような新しい関数を作成できることを知っていますが、既存のをオーバーライドできればよいでしょうprint
。
perldoc perlvar
は警告のほとんどを説明していますが、なぜここでそれらを非難するのですか?
Perlでは、私のprint
ステートメントのほとんどが次の形式をとります
print "hello." . "\n";
すべての厄介な "\ n"を横に置いておくのを避ける良い方法はありますか?
私はmyprint
自動的に\ nを追加するような新しい関数を作成できることを知っていますが、既存のをオーバーライドできればよいでしょうprint
。
perldoc perlvar
は警告のほとんどを説明していますが、なぜここでそれらを非難するのですか?
回答:
Perl 6はsay
自動的に追加する機能を持っています\n
。
say
追加すると、Perl 5.10または5.12 でも使用できます。
use feature qw(say);
プログラムの始めに。または、Modern :: Perlを使用して、この機能やその他の機能を取得することもできます。
詳細については、perldoc機能を参照してください。
use 5.012;
それuse 5.010;
を取得するか、取得するだけですperl
。
この-l
オプションは、she-bangヘッダーで使用できます。
#!/usr/bin/perl -l
$text = "hello";
print $text;
print $text;
出力:
hello
hello
おそらく、出力レコードセパレータを次のように改行に変更したいでしょう:
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」を追加することは「厄介な」雑用だとは思いませんが、誰かが本当にそれらを避けたい場合は、これが1つの方法です。この手法を使用する少しのコードを維持する必要がある場合は、おそらくそれを前もってリファクタリングするでしょう。
"helo\r\n"
今送信するメッセージを送信するネットワークコードを想像してください"helo\r\n\n"
。
local $\ = "\n";
-l
、コマンドラインのワンライナーに最適です(perldoc.perl.org/perlrun.html#Command-Switchesを参照)。大きなプログラムではお勧めしません。
これが私が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";
5.10より前のバージョンで困っている場合、上記のソリューションではsay
機能が完全に複製されません。例えば
sub say { print @_, "\n"; }
次のような呼び出しでは機能しません
say for @arr;
または
for (@arr) {
say;
}
...上記の関数は、暗黙の大域的な$_
like 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
#
say
Perl6の中に組み込みは少し異なる動作をします。say @arr
orで呼び出すと@arr.say
、配列項目が連結されるだけでなく、リストのセパレーターで区切られて出力されます。これをperl5で複製するには、次のようにします
sub say {
if (@_) { print join($", @_) . "\n"; }
else { print $_ . "\n"; }
}
$"
グローバルリストセパレーター変数です。使用している場合English.pm
は$LIST_SEPARATOR
これで、perl6のように動作します。
say @arr;
# OUTPUT
# alpha beta gamma
#