Perl에서 대부분의 print
진술은 다음과 같은 형식을 취합니다.
print "hello." . "\n";
모든 성가신 "\ n"를 주변에 두지 않는 좋은 방법이 있습니까?
myprint
자동으로 \ n을 추가하는 것과 같은 새 함수를 만들 수 있다는 것을 알고 있지만 기존 print
.
perldoc perlvar
대부분의주의 사항을 설명합니다. 왜 여기에서 애를 씁니까?
Perl에서 대부분의 print
진술은 다음과 같은 형식을 취합니다.
print "hello." . "\n";
모든 성가신 "\ n"를 주변에 두지 않는 좋은 방법이 있습니까?
myprint
자동으로 \ n을 추가하는 것과 같은 새 함수를 만들 수 있다는 것을 알고 있지만 기존 print
.
perldoc perlvar
대부분의주의 사항을 설명합니다. 왜 여기에서 애를 씁니까?
답변:
펄 6 갖는 say
자동 추가 기능 \n
.
say
다음을 추가하면 Perl 5.10 또는 5.12 에서도 사용할 수 있습니다.
use feature qw(say);
프로그램 시작 부분까지. 또는 Modern :: Perl 을 사용 하여이 기능과 기타 기능을 얻을 수 있습니다.
자세한 내용은 perldoc 기능 을 참조하십시오.
use 5.012;
또는 use 5.010;
얻는 것 perl
입니다.
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
업데이트 : 내 대답은 권고보다는 능력에 관한 것입니다. 줄 끝에 "\ n"을 추가하는 것이 "성가신"잡일이라고 생각하지 않지만 누군가가 정말로 그것을 피하고 싶다면 이것은 한 가지 방법입니다. 이 기술을 사용하는 약간의 코드를 유지해야한다면 아마도 리팩토링 할 것입니다.
"helo\r\n"
지금 보내는 메시지 를 보낸 네트워킹 코드를 상상해보십시오 "helo\r\n\n"
.
local $\ = "\n";
-l
것은 명령 줄 한 줄에 유용합니다 ( perldoc.perl.org/perlrun.html#Command-Switches 참조 ). 더 큰 프로그램에서는 권장하지 않습니다.
https://perldoc.perl.org/perlvar.html 에서 찾은 내용은 다음과 같습니다 .
$ \ 인쇄 연산자의 출력 레코드 구분 기호입니다. 정의 된 경우이 값은 마지막 인쇄 인수 다음에 인쇄됩니다. 기본값은 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
또는로 호출하면 @arr.say
배열 항목을 연결하는 것이 아니라 목록 구분 기호로 구분하여 인쇄합니다. 이것을 perl5에서 복제하려면 다음을 수행합니다.
sub say {
if (@_) { print join($", @_) . "\n"; }
else { print $_ . "\n"; }
}
$"
글로벌 목록 구분 변수, 또는 당신이 사용하는 경우 English.pm
다음이다$LIST_SEPARATOR
이제 perl6처럼 작동합니다.
say @arr;
# OUTPUT
# alpha beta gamma
#