2010-11-27 5 views
1

이 함수의 기능은 무엇입니까?Perl : 기본 질문, 함수 기능

sub MyDigit { 
     return <<END; 
     0030\t0039 
     END 
    } 
+2

당신이 그것을 호출했을 때 어떤 일이 있었습니까? –

+0

정규식에 사용하기 위해 ASCII 숫자로만 구성된 문자 클래스를 정의합니다. 내 대답을 보라. PS : 즉 기입 안 [Le_Cœur (http://translate.google.com/#en|fr|Where%20is%20my%20heart%3F) * n'est-CE 우선권 * – tchrist

답변

8

:

print "this is ", 
    "one line when printed, ", 
    "because print takes multiple ", 
    "arguments and prints them all!\n"; 
print "however, you can also " . 
    "concatenate strings together " . 
    "and print them all as one string.\n"; 

print <<DOC; 
But if you have a lot of text to print, 
you can use a "here document" and create 
a literal string that runs until the 
delimiter that was declared with <<. 
DOC 
print "..and now we're back to regular code.\n"; 

설명서에 대한 자세한 내용은 perldoc perlop을 참조하십시오.

+0

OP의 'END'는 정렬되어 있지 않습니다. 결과적으로, OP 코드에는 유효한 heredoc이 포함되어 있지 않습니다. –

+0

@Sinan : 필자는 그것이 필사본에 오타가 있다고 가정하고 있었지만 실제로 사실인지 확인하는 것은 확실히 합리적입니다. – Ether

+2

@Sinan : 내 대답보기. 모두가 정말로 여기에있는 일을 놓쳤습니다! – tchrist

2

그것은 뭔가 문자열을 반환하는 Here Document라고 사용하는 "0030 \ t0039"는 "here-document"을라고, 그리고 연결하는 대안 또는 목록 작업으로 여러 줄에 걸쳐 문자열을 분쇄에 사용되는

+0

외설 그 요점이지. 내 대답을 보라. – tchrist

2

문자열이 "0030\t0039\n" (\t은 탭이고, \n은 줄 바꿈 (분명히)로 끝나기 때문에 추가되는 새 줄)을 반환합니다.

<<FOO 
sometext 
FOO 

여러 줄의 문자열을 편리하게 작성하는 방법 인 heredoc (여기서는 단 한 줄만 사용함)입니다.

+0

'\ t' 리터럴을 만들기 위해 추가 할 수있는 수정 자도 없습니까? 나는 어딘가에 작은 따옴표를 넣을 필요가 있다는 것을 기억하는 것 같다 ... – Cameron

+0

@Sinan : 예, 했어요. 고쳤다. 감사. – sepp2k

+0

@Cameron : [documentation] (http://perldoc.perl.org/perlop.html# << EOF) : "작은 따옴표는 텍스트가 내용의 보간없이 문자 그대로 취급된다는 것을 나타냅니다. 백 슬래시가 특별한 의미가 없다는 것을 제외하고는 작은 따옴표로 묶은 문자열로 ". 그래서 당신은'<< 'FOO'라고 말할 필요가 있습니다. – Vlad

0

당신은 간단한 실험을 시도하여 자신을 도울 수 :

C:\Temp> cat t.pl 
#!/usr/bin/perl 

use strict; use warnings; 

print MyDigit(); 

sub MyDigit { 
    return <<END; 
    0030\t0039 
END 
} 

출력 :

C:\Temp> t | xxd 
0000000: 2020 2020 3030 3330 0930 3033 390d 0a  0030.0039..

지금, 당신의 경우, END가 줄의 시작 부분에 줄 지어되지 않으므로 메시지를 받아야합니다 :

Can't find string terminator "END" anywhere before EOF at …
+1

그렇습니다. 그러나 실제로 heredox에 대한 교훈을 전달하려는 경우 [unichars] (http://training.perl.com/scripts/unichars), [uninames] (http : //)에서 내 dequeuing 전략을 생각합니다. training.perl.com/scripts/uninames), [uniprops] (http://training.perl.com/scripts/uniprops), 심지어는 [leo] (http://training.perl.com/scripts/leo) 가장 깨끗한보고 heredox합니다. 그러나 실제로 여러분 모두는 함수가 실제로하는 일을 놓쳤습니다. 그것은 ASCII 숫자와 만 일치하는 속성을 생성합니다. 반드시'\ p {POSIX_Digit}'이 (가) v5.12 릴리스에 등장했습니다. – tchrist

+0

@tchrist 나는 그것이 'deQ'라고 생각한다. –

7

모두를 놓쳤습니다!

그것은 정규 표현식을 사용하여 \p{MyDigit}\P{MyDigit}에 사용할 사용자 정의 속성을 정의합니다.

그것은 이들처럼 : 또는

sub InKana { 
     return <<'END'; 
    3040 309F 
    30A0 30FF 
    END 
    } 

, 기존 속성 이름의 관점에서 그것을 정의 할 수 있습니다 : 당신은 또한 사용하여 뺄셈을 설정 할 수

sub InKana { 
     return <<'END'; 
    +utf8::InHiragana 
    +utf8::InKatakana 
    END 
    } 

"C를 < ->"접두사 . 만 문자의 블록 범위가 아닌 실제 문자를 원한다고 가정합니다. 당신은 이런 식으로 모든 정의되지 않은 것들을 걸러 수 :

sub IsKana { 
     return <<'END'; 
    +utf8::InHiragana 
    +utf8::InKatakana 
    -utf8::IsCn 
    END 
    } 
은 "C"접두어를 사용하여 설정 당신은 또한 보완 문자로 시작할 수 있습니다

: 내가 잘해야합니다 그림

sub IsNotKana { 
     return <<'END'; 
    !utf8::InHiragana 
    -utf8::InKatakana 
    +utf8::IsCn 
    END 
    } 

을, 이후 나는 ex camelis라고 말하고 있습니다. :)

+0

나는 당신의 말을';-)'Oh, and, + 1_000_000'라고 말할 것이다. ... –

+0

이 기능을 유용하게 사용하려면이 네임 스페이스에 어떤 네임 스페이스가 있어야합니까? – Ether

+0

@Ether : 당신이 지정한 것 :'\ p {Some :: Function}'은'% Some ::'네임 스페이스에있는 반면,'\ p {Function} '은'current '패키지에 있습니다. 흐름. – tchrist