Programing

Perl의 프린트는 어떻게 기본적으로 개행을 추가 할 수 있습니까?

lottogame 2020. 9. 11. 19:27
반응형

Perl의 프린트는 어떻게 기본적으로 개행을 추가 할 수 있습니까?


Perl에서 대부분의 print진술은 다음과 같은 형식을 취합니다.

print "hello." . "\n";

모든 성가신 "\ n"를 주변에 두지 않는 좋은 방법이 있습니까?

myprint자동으로 \ n을 추가하는 것과 같은 새 함수를 만들 수 있다는 것을 알고 있지만 기존 print.


펄 6 갖는 say자동 추가 기능 \n.

say다음을 추가하면 Perl 5.10 또는 5.12 에서도 사용할 수 있습니다.

use feature qw(say);

프로그램 시작 부분까지. 또는 Modern :: Perl사용 하여이 기능과 기타 기능을 얻을 수 있습니다.

자세한 내용은 perldoc 기능 을 참조하십시오.


-lshe-bang 헤더 옵션을 사용할 수 있습니다 .

#!/usr/bin/perl -l

$text = "hello";

print $text;
print $text;

산출:

hello
hello

Perl 5.10+가 옵션이 아닌 경우 여기에 빠르고 더러운 근사치가 있습니다. say 첫 번째 인수가 핸들 일 때 약간의 마법이 있기 때문에 정확히 동일하지는 않지만 STDOUT에 인쇄하기위한 것입니다.

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

say 'hello';

print 문을 작성하는 방식은 불필요하게 장황합니다. 개행을 자체 문자열로 분리 할 필요가 없습니다. 이것으로 충분합니다.

print "hello.\n";

이러한 인식은 일반적으로 코딩을 더 쉽게 만들 것입니다.

use feature "say"또는 use 5.10.0또는 use Modern::Perl내장 say기능 을 사용하는 것 외에도 기본적 으로 많은 현명한 누락 된 Perl 5 기능을 켜는 pimp perl5i 를 사용 하겠습니다 .


다음을 사용하여 출력 레코드 구분 기호를 줄 바꿈으로 변경하려고 할 수 있습니다.

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

Update: my answer speaks to capability rather than advisability. I don't regard adding "\n" at the end of lines to be a "pesky" chore, but if someone really wants to avoid them, this is one way. If I had to maintain a bit of code that uses this technique, I'd probably refactor it out pronto.


In Perl 6 there is, the say function


If you're stuck with pre-5.10, then the solutions provided above will not fully replicate the say function. For example

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

Will not work with invocations such as

say for @arr;

or

for (@arr) {
    say;
}

... because the above function does not act on the implicit global $_ like print and the real say function.

To more closely replicate the perl 5.10+ say you want this function

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

Which now acts like this

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

The say builtin in perl6 behaves a little differently. Invoking it with say @arr or @arr.say will not just concatenate the array items, but instead prints them separated with the list separator. To replicate this in perl5 you would do this

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

$" is the global list separator variable, or if you're using English.pm then is is $LIST_SEPARATOR

It will now act more like perl6, like so

say @arr;
# OUTPUT
# alpha beta gamma
#

Here's what I found at https://perldoc.perl.org/perlvar.html:

$\ The output record separator for the print operator. If defined, this value is printed after the last of print's arguments. Default is undef.

You cannot call output_record_separator() on a handle, only as a static method. See IO::Handle.

Mnemonic: you set $\ instead of adding "\n" at the end of the print. Also, it's just like $/ , but it's what you get "back" from Perl.

example:

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

참고URL : https://stackoverflow.com/questions/2899367/how-can-perls-print-add-a-newline-by-default

반응형