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


95

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

print "hello." . "\n";

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

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


10
답변에 $ \가 포함되어 있으면 보이지 않는 효과로 전역 변수를 설정하는 것에 대한주의 사항 목록이 함께 제공되는지 확인하십시오. 매우 영리하고 기술적으로 질문에 대한 답변을 제공하지만 초보자에게 자격이없는 사람을 넘기는 것도 매우 위험합니다.
Schwern

1
perldoc perlvar대부분의주의 사항을 설명합니다. 왜 여기에서 애를 씁니까?
David M

5
@David, 일부 임의의 해커가 perldoc 대신 여기에서 답변을 검색하고 만족하며 경고에 대해서도 알지 못하기 때문입니다!
P Shved

2
그것은 내가 옷을 입는 동안 옷을 다림질해서는 안된다는 경고 라벨을 내 다리미에 붙인 기괴한 추론입니다.
David M

8
실제 도구에는 물리적 세계에서 삶을 살아온 사람들이 합리적으로 잘 이해하는 물리적 한계가 있습니다. 소프트웨어 도구에는 그러한 제한이 없으며 규칙도 없습니다. 그들은 무엇이든 할 수 있으며, 특히 합리적인 기대의 경계를 아직 배우지 않은 초보자의 경우 기대 이상으로 자주 행동합니다.
Ether

답변:


99

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

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

use feature qw(say);

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

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


7
사실, 당신이해야 할 일은 최신 s를 실행하는 경우 use 5.012;또는 use 5.010;얻는 것 perl입니다.
Robert P

Perl 6이 질문이 Perl 5를 참조한다고 구체적으로 언급되지 않는 한 가정하는 것이 안전하지 않습니까?
wobbily_col

35

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

#!/usr/bin/perl -l

$text = "hello";

print $text;
print $text;

산출:

hello
hello

3
아주 좋아. 수행중인 작업을 perl포함한 옵션 에 대한 자세한 내용 -l여기 .
ruffin

1
글로벌이기 때문에 이것은 한 줄짜리 스크립트와 가장 작은 스크립트를 제외한 모든 것에서 나쁜 습관입니다.
Schwern

24

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

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

say 'hello';

20

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

print "hello.\n";

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

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


9

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

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"을 추가하는 것이 "성가신"잡일이라고 생각하지 않지만 누군가가 정말로 그것을 피하고 싶다면 이것은 한 가지 방법입니다. 이 기술을 사용하는 약간의 코드를 유지해야한다면 아마도 리팩토링 할 것입니다.


6
아니, 그러지 마세요. 기술적으로는 정답이지만 사소한 것에 특수 변수를 사용하는 것은 앞으로의 유지 관리 부담입니다.
tsee

1
@tsee 나는 실제로 완전히 동의합니다. 내가 표시하기 위해 내 대답을 편집함에 따라 내 대답은 일반적인 관행으로 권장하지 않더라도 기능을 설명합니다.
David M

진짜 위험은 이제 모든 코드가 줄 바꿈을 추가 할 것이라는 사실에서 비롯됩니다. 심지어 다른 사람들의 모듈에있는 코드도 예상하지 못했던 코드도 포함됩니다. "helo\r\n"지금 보내는 메시지 를 보낸 네트워킹 코드를 상상해보십시오 "helo\r\n\n".
Chas. 오웬

물론 다른 코드에 영향을주지 않기 위해 항상 로컬로 만들 수 있지만 여전히 서브 루틴을 좀 더 깔끔하게 만들고 싶습니다.local $\ = "\n";
redbmk

명령 플래그를 사용하는 -l것은 명령 줄 한 줄에 유용합니다 ( perldoc.perl.org/perlrun.html#Command-Switches 참조 ). 더 큰 프로그램에서는 권장하지 않습니다.
djd

4

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";


1

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
#

sayperl6 의 내장 기능은 약간 다르게 작동합니다. 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
#
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.