2010-11-27 17 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 pas?* – 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

それisnその点。私の答えを見てください。 – tchrist

2

これは、文字列"0030\t0039\n"\t)を返します。改行で改行(明らかに)で終わるので、追加される改行は\nです。

<<FOO 
sometext 
FOO 

は、いわゆるヒアドキュメント、(それが唯一のラインで使用され、ここが)便利な複数行の文字列を記述する方法です。

+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:// 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

であるべきだと思います。私はあなたの言葉をそれを' ;-) 'ああ、そして' + 1_000_000'と言います。 ... –

+0

この機能を有効にするためには、この機能にはどのような名前空間が必要ですか? – Ether

+0

@Ether: '\ p {Some :: Function}'は '%Some ::'名前空間にありますが、 '\ p {Function} 'は'現在の 'パッケージにあります。現在。 – tchrist