この関数は何をしますか?
sub MyDigit {
return <<END;
0030\t0039
END
}
これは「ヒアドキュメント」と呼ばれ、連結またはリスト操作の代わりに、文字列を複数行に分割するために使用されます。
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";
マニュアルのヒアドキュメントについて詳しくは、perldocperlopを参照してください。
あなたはすべてポイントを逃しました!
正規表現\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
}
私は元カメリスを話しているので、私は正しいに違いないと思います。:)
ヒアドキュメントと呼ばれるものを使用して、文字列「0030\t0039」を返します。
文字列を返します"0030\t0039\n"
(行が(明らかに)改行で終わるために追加される\t
タブと改行です)。\n
<<FOO
sometext
FOO
いわゆるヒアドキュメントであり、複数行の文字列を便利に記述する方法です(ただし、ここでは1行のみで使用されます)。
あなたは簡単な実験を試みることによってあなた自身を助けることができます:
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
は行の先頭に並んでいないので、次のメッセージが表示されているはずです。
EOFの前のどこにも文字列ターミネータ「END」が見つかりません…