Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
はてなリモートインターン2021 Perlブートキャンプ 講義資料
Search
Hatena
October 08, 2021
Technology
0
5.2k
はてなリモートインターン2021 Perlブートキャンプ 講義資料
https://hatenacorp.jp/recruit/intern/2021
Hatena
October 08, 2021
Tweet
Share
More Decks by Hatena
See All by Hatena
はてなインターンシップ2024 HTTP, Web, API 講義資料
hatena
0
1.1k
はてなインターンシップ2024 RDBMS ブートキャンプ講義資料
hatena
0
880
はてなインターンシップ2024 フロントエンドブートキャンプ講義資料
hatena
0
800
はてなインターンシップ2024 コンテナ講義資料
hatena
0
880
はてなインターンシップ2024 コンテナオーケストレーション講義資料
hatena
0
790
はてなインターンシップ2024 インフラ講義資料
hatena
0
810
はてなインターンシップ2024 AI 講義資料
hatena
0
800
はてなインターンシップ2024 ブログライティング講義資料
hatena
4
3k
はてなリモートインターンシップ2023 Web, HTTP 講義資料
hatena
1
490
Other Decks in Technology
See All in Technology
ハイテク休憩
sat
PRO
2
180
Oracle Cloud Infrastructure:2024年12月度サービス・アップデート
oracle4engineer
PRO
1
270
サーバーなしでWordPress運用、できますよ。
sogaoh
PRO
0
120
3年でバックエンドエンジニアが5倍に増えても破綻しなかったアーキテクチャ そして、これから / Software architecture that scales even with a 5x increase in backend engineers in 3 years
euglena1215
9
3.5k
継続的にアウトカムを生み出し ビジネスにつなげる、 戦略と運営に対するタイミーのQUEST(探求)
zigorou
0
830
Qiita埋め込み用スライド
naoki_0531
0
5.3k
C++26 エラー性動作
faithandbrave
2
820
オプトインカメラ:UWB測位を応用したオプトイン型のカメラ計測
matthewlujp
0
200
なぜCodeceptJSを選んだか
goataka
0
180
pg_bigmをRustで実装する(第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
shinyakato_
0
110
AWS re:Invent 2024 ふりかえり勉強会
yhana
0
450
UI State設計とテスト方針
rmakiyama
3
790
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
520
How to train your dragon (web standard)
notwaldorf
88
5.7k
GraphQLとの向き合い方2022年版
quramy
44
13k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
The World Runs on Bad Software
bkeepers
PRO
66
11k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.4k
Documentation Writing (for coders)
carmenintech
67
4.5k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
26
1.9k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
How GitHub (no longer) Works
holman
311
140k
Transcript
)BUFOB3FNPUF*OUFSOTIJQ &9铺紶 1FSMه٭ع؞ٔ٤و JEUL[XULT悂很㼵
舅䄕磆☭ ˝ JEUL[XULT悂很㼵 ˝ 䇗僖⪌炘 ˝ 哅ⳉ塷 ˝ ؠّٙ ˝
(JHB7JFXFS ˝ עיםرؕؓٛ٭磙▼ ˝ 뇧嫎סJ؆ל
1FSM鐆؆ד׆כ傴ַג׆כֵױ ־
1FSM
1FSM 1FSMق٭ٜכעյٚٛ٭٬ؚؗ٭ٜמזיꝧ氦גوٞ ءِٚ٤ء銧鏤ךֵն㲔榫䓪כ㛡喋䓪ꄆ釱יֽյ$銧鏤 TFEյBXLյبؘٜتؠٛوعםל☽סوٞءِٚ٤ء銧鏤ס⨣ ג嚀耆⪌יַնؘؗه٬ؓوٛآ٭ب٘٤յبتط ّ畘杼յط؞تع⭚杼םלסوٞءّٚ傴ׂסמ䇶ׂ榫ַ יַն
1FSM ˝ (Pכ鷿זיյؤ٤قٜؕםַؕ٤ذوٛذ㑔銧鏤 ˝ #FUUFSTIFMMכי✳ֻյؘؗهؓوٛآ٭ب٘٤ 傴ׂ׆כדזיך׀ ˝ 碛企ַؘؗهꝧ氦ס鷹⪮כיյׂ־☔妳ס-JHIUXFJHIU -BOHVBHF ˝
עים%F/"NJYJ-*/& ˝ ײם؆ֿ鿥㷯◀㲊סز٭ّך
إ٭ٜ 侇ꝴ䍚ךր1FSM㱭⪒מ杼鉮גցמם
إ٭ٜ סעה؆ꦘַסך ˝ 仴㰆סؤ٭غ鐆׳ג״סז䫇־ֿ⛼ֹמם ˝ ㍭זגכ׀סؕ٤ظشؠتכי ˝ ⼽סؤ٭غ⹆縒מםֿ1FSMֿ傴ֹׄמם
1FSMמ鉴יַׂ⯥מ
غ؞ْٖ٤عעQFSMEPDך䌕ׂ % perldoc Carton # Ϟδϡʔϧʢޙड़ʣͷυΩϡϝϯτ % perldoc -f print
# ΈࠐΈؔ -f % perldoc -v !" # ΈࠐΈม -v % perldoc perl
$1"/ ˝ 5IF$PNQSFIFOTJWF1FSM"SDIJWF/FUXPSL ˝ IUUQTNFUBDQBOPSH ˝ ┩槡╈סױױם1FSMٓةٖ٭ֿٜױזיַ ˝ 1FSMס銧鏤氳ם䍚ײס┉חؤِٖؼطؔ
$BSUPO ˝ 3VCZךַֹ#VOEMFSײגַםס ˝ cpanfileמ傴ַגٓةٖ٭ٜ⺲!ف٭ة٘٤յٞ٭ٜס ظؔٝؠعٛlocal/מؕ٤تع٭ٜיׂ ˝ ز٭ّךע%PDLFS✳ֹסךֵױゖ갭מעםםַ־
1FSMכַֹ銧鏤
˝ ٓةٖ٭ٜ package Example!"Greeter; use strict; use warnings; sub greet
{ my ($class, $what) = !#; print "hello, $what\n"; } 1;
˝ ْؕ٤تؠٛوع use strict; use warnings; use lib 'lib'; use
Example!"Greeter; Example!"Greeter!#greet('world'); ˝ 㲔车 % perl -Ilib main.pl hello, world
ֽױםַ ˝ VTFTUSJDUVTFXBSOJOHT ˝ 碛ס1FSMע־ם舅榺 ˝ VTFTUSJDUכNZך㲚銧יַםַ㚺丗ֵֿכꪐ氳מ ؙٚ٭ ˝ VTFXBSOJOHTכ閛⼔ֿ僗Ⲗמם
˝ 鎋ׂעQFSMEPDTUSJDUQFSMEPDXBSOJOHT
㚺丗 ˝ 1FSMס㚺丗עյאסظ٭ذ㑔מ䑴יبةٜכ⽛ף鋗⺘ֿ ⩝מחׂ ˝ my $hogeסֹמי㚺丗㲚銧 ˝ ꪐ氳ם㑔עםַ ˝
$@%
تٚ ˝ חס⡁ ˝ 丗㰄乃㰄⮛יتٚ my $scalar1 = 'test'; my
$scalar2 = 1000; my $scalar3 = \@array; # ϦϑΝϨϯεʢޙड़ʣ ˝ 狜乃㰄⮛עGBMTZם⡁כי䣽 ˝ GBMTZ
VOEFG ˝ تٚ㚺丗ס⮣僿⡁ ˝ ַVOEFOFEכ־OJMכ־ ˝ EFOFE磝ײ鱮ײ㚺丗ךVOEFG־לֹ־زؘشؠך׀ my $x; print
$x; # "Use of uninitialized value $x in print"
!鿥⮛ my @array = ('a', 'b', 'c');
鿥⮛סؓؠجت print $array[1]; # !" b ˝ 鿥⮛סַה釐碛עتٚםסךյؓؠجت㕙⺬עBSSBZ<> מם ˝
BSSBZכ!BSSBZע⮯擻
鿥⮛ס䳩⛼ $array[0]; # get $array[1] = 'hoge'; # set push
@array, 'meow'; # ࠷ޙʹཁૉΛՃ my $v = shift @array; # ࠷ॳͷཁૉΛऔΓআ͍ͯฦ͢ my $length = scalar @array; # ͞ for my $e (@array) { # શཁૉϧʔϓ print $e; }
鿥⮛ס䳩⛼ my @doubles = map { $_ * 2 }
@numbers; # ͯ͢Λ2ഒʹͨ͠ྻΛ࡞Δ my @over20 = grep { $_ > 20 } @numbers; # 20ΑΓେ͖ͳ͚ͩΛूΊͨྻΛ࡞Δ ˝ $_ע攐墤㚺丗 ˝ ׆ס㕙⺬ךע鿥⮛ס⺨釐碛ֿꯂמ⭳י⪌זיׂ
ـشبٖ ˝ ַظؔؠب٘ػُٛشو my %hash = ( perl !" 'larry',
ruby !" 'matz', ); ˝ עGBUDPNNBכ⽛ףյ QFSMMBSSZ ע QFSM MBSSZ כ⺱┉ ˝ ⺓鱨ע鿥⮛סכ׀כ⺱喋םٛتعדֿյל؆ם㚺丗מ劲硯 ־ךؓؠجتס☼亠ֿ㚺 ˝ ؤ٤ط؞تع
ٛنؒٝ٤ت ˝ כיꄆ釐 ˝ ٛنؒٝ٤تتٚ鿥⮛ـشبٖםלס⹆拨 ˝ 1FSMס鿥⮛ـشبٖע־ם碛儢 ˝ 邾ꥭםظ٭ذ啶鵰⛼㕙⺬מ䑒䑒釐מם
ٛنؒٝ٤ت ˝ ⪌㯸ס车⮛⛼זיײ־ my @matrix = ( (0, 1, 2,
3), (4, 5, 6, 7), ); ˝ ׆סؤ٭غע鿥⮛ס⺬䡗מם ˝ ٛتع⪌㯸מך׀םַ my @matrix = (0, 1, 2, 3, 4, 5, 6, 7);
א׆ךٛنؒٝ٤ت my @array = ('a', 'b', 'c'); my $ref =
\@array; # @array ͷϦϑΝϨϯε my $ref = ['a', 'b', 'c']; # ্هͷུهɻͪͳΈʹ \('a', 'b', 'c') ผ # 2ͭͷྻͷϦϑΝϨϯεΛͬͨʢ͞2ͷʣྻ my @matrix = ( [0, 1, 2, 3], [4, 5, 6, 7], );
鿥⮛ٛنؒٝ٤تסؓؠجت my @array2 = @$ref; # ಄ʹ @ Λ͚ͭͯྻʹ͢ʢσϦϑΝϨϯεʣ print
$ref!"[1]; # !" ΛͬͯΞΫηε
ـشبٖٛنؒٝ٤ت my %hash = ( perl !" 'larry', ruby !"
'matz', ); my $ref = \%hash; # ུه my $ref = { perl !" 'larry', ruby !" 'matz', };
ـشبٖٛنؒٝ٤تסؓؠجت my $ref = { perl !" 'larry', ruby !"
'matz', }; # % Λ಄ʹ͚ͭͯσϦϑΝϨϯε # keysΈࠐΈؔɻϋογϡͷΩʔͷҰཡΛऔಘ͢Δ my @keys = keys %$ref; print $ref!#{perl}; # !# ͰΞΫηε
ظٛنؒٝ٤تַַ ˝ םמ־ס䌋ظٛنؒٝ٤تכ׀ע!\^כ־\^ך ㍱׳ my $a_of_a = [ [1, 2,
3], [4, 5, 6], ]; my @array = @{ $a!"[1] };
˝ 1PTUYEFSFGFSFODF my @array = $a!"[1]!"@*;
塜釨辐杯 ˝ 1FSMס䍚ײסץכחն״ה䍚ⱱ ˝ ך塜釨辐杯ٛطٜٚ榟䡗յ_ך乃㰄⮛מُشز my ($id) = ("͜Μʹͪɺid:motemen Ͱ͢"
=~ /id:(.+)/); # จࣈྻϚονͰҰ෦Λൈ͖ग़͢ my @lines = split /\n/, $text; # ೖྗΛߦʹׂ ˝ QFSMEPDQFSMSF
אס־ ˝ if乃כ־ע䘶⥼鵟ססֿדַגֵַ ˝ else ifעםׂיelsif ˝ ٜ٭وס⯆䐒啶乃 ˝ continueעnext
breakעlast ˝ 乃㰄⮛ס奂鬳ע!"םלךעםׂeq ˝ QFSMEPDQFSMPQ
אס־ ˝ 乃㰄⮛ס磵⺬ע غشع璡 $hoge = 'abc' . 'def' #
abcdef ˝ qw(foo bar baz)ע('foo', 'bar', 'baz')ס矴辉啶乃 ˝ perldoc -f qw
ؤ٤ط؞تع ˝ 1FSMסꦘַכ׆סץכח ˝ 䌋鍐❫꤀מ縒䜡䑒釐ֵֿ ˝ تٚؤ٤ط؞تعכٛتعؤ٤ط؞تعֵֿ my @array =
(10, 20, 30); my @x = @array; # ͜ͷ @array ϦετίϯςΩετͰධՁ͞ΕΔ my $y = @array; # ͜ͷ @array εΧϥίϯςΩετͰධՁ͞ΕΔ my ($z) = @array; # ͜ͷ @array ϦετίϯςΩετͰධՁ͞ΕΔ
ؤ٤ط؞تع ˝ @xֿ(10, 20, 30)מםסעױֵ舅抅 ˝ ךע$yע ˝ $y !"
3 ˝ 鿥⮛تٚؤ٤ط؞تعך鍐❫כאסꝎ鲭 ˝ $zמע鿥⮛ס⩝釐碛ֿ♏⪌$z !" 10鿥⮛ס墦 ע䩰י
ؤ٤ط؞تعסֵׂ粸 ם؆־ٗ٭ا־鴜ג⪌ⱱׄכյٛتعؤ٤ط؞تع ךע鿥⮛鲭꞊丗param()ֵֿזגכי my $in = { name !" param('key')
# ͜ͷؔݺͼग़͠ϦετίϯςΩετͰධՁ͞ΕΔ };
ؤ٤ط؞تعסֵׂ粸 my $in = { name !" ('foo', 'bar', 'baz')
}; my $in = { name !" 'foo', bar !" 'baz', }; כַֹ䚉מםյם־CBSכַֹ┘䓙閱ם؞٭ֿ榟ֻյ┘⺎鉮 םفءס⸉㍔כםֹ
ؤ٤ط؞تعؠؕث sort <͜͜>; length <͜͜>; if (<͜͜>) { } for
my $i (<͜͜>) { } $obj!"method(<͜͜>); my $x = <͜͜>; my ($x) = <͜͜>; my @y = <͜͜>; my %hash = ( key0 !# 'hoge', key1 !# <͜͜>, ); scalar(<͜͜>); <͜͜>;
ؤ٤ط؞تعؠؕث鉮璻 sort <Ϧετ>; length <Ϧετ>; if (<εΧϥ>) { } for
my $i (<Ϧετ>) { } $obj!"method(<Ϧετ>); my $x = <εΧϥ> my ($x) = <Ϧετ>; my @y = <Ϧετ>; my %hash = ( key0 !# 'hoge', key1 !# <εΧϥ>, ); scalar(<Ϧετ>); <εΧϥ>;
꞊丗ئهٜ٭ز٤ sub foo { my ($a, $b, $c) = !";
} סֹמ㲚銧י foo(1, 2, 3); ך⽛צ⭳ն䌕丗םס꞊丗⽛צ⭳עشؤ泸樋ך׀
䌕丗סׄ亠 sub add { my ($x, $y) = !"; return
$x + $y; } my $three = add(1, 2); ˝ add(1,2)כ⽛צ⭳גכ׀ס䌕丗ע!"כַֹ攐墤ם鿥⮛מ 劲硯 ˝ ׆ֿ($x, $y)מ⮆Ⱏ♏⪌
䌕丗סׄ亠 ˝ shift✳ֹ ˝ 䌕丗םסshiftע倊랺氳מ!"䌕丗מ ˝ my $arg1 = shift;ככ!"ס⩝釐碛ֿ$arg1מ♏⪌
˝ !"ע鿥⮛םסך ˝ my $arg1 = $_[0]ך僃⮣ס䌕丗מؓؠجت׆כך׀
䌕丗⭚杼ؕظؔ؛ّ sub func1 { my ($arg1, $arg2, %args) = !";
my $opt1 = $args{opt1}; my $opt2 = $args{opt2}; } func1('hoge', 'fuga', opt1 !# 1, opt2 !# 2); 僃䏲מ%argsכׄ׆כך泸樋⺎耆ם⺲⯥♀׀䌕丗㲔杯 ך׀
⡁ס鲭亠 ˝ returnך鲭ֿյ泸樋⺎耆 ˝ 泸樋ג㕙⺬ע僃䏲מ鍐❫ג䌋ס磵冽ֿ鲭⡁כם ˝ 䙫㍲ֿ־טׂםסך傴׀ױֹ
ٓةٖ٭ٜبتطّ ˝ قشآ٭ة package Example!"Greeter; כ傴ׂכյ♓סخ٭تؤ٭غעExample!"Greeterכַֹ⺲⯥ 狜ꝴמ㷯 قشآ٭ةכע꞊丗ס⺲⯥ֿ䢥㷯⩝յכ縒ֻכ荁ַ
ٓةٖ٭ٜبتطّ ˝ قشآ٭ة package A; sub foo { !!" }
package B; sub bar { !!" } אבA!"foo()B!"bar()ך꞊丗⹆拨ך׀
ٓةٖ٭ٜبتطّ哭釐 ˝ use Foo!"Bar!"Baz ˝ lib/Foo/Bar/Baz.pmֿ鐆ײ鱮ױյFoo!"Bar!"Baz⺲ ⯥狜ꝴֿ⛼ ˝ 1FSMס㲔车نٜؒؕע.plٓةٖ٭ٜע.pm䦡䍖㯸 ˝
㲔ⳉך傴ׂסעכ؆ל.pm
ٓةٖ٭ٜبتطّ哭釐 ˝ VTFגכ׀סنٜؒؕס䫒碟⩝ע@INCכַֹءٞ٭فٜם攐 墤㚺丗מ劲硯יַ ˝ 䜉綗氳מյوٞةؘؠع泡┖ס./lib@INCמ⪌ֹ啶 䡗יַ ˝ @INC泡䫘䳩⛼גյperl -Ilibך颯Ⳃ
˝ perldoc -f useperldoc -v @INC
⪯㑔氳םٓةٖ٭ٜ package Foo!"Bar!"Baz; use strict; use warnings; # ͜ͷύοέʔδͷ֎͔Β Foo!"Bar!"Baz!"public_function
ͰΞΫηεͰ͖Δͧ sub public_function { !!# } # ඇެ։ͳؾͷϝιου _ Ͱ͡ΊΔͧɻؾ͚ͩͳͷͰ֎͔ΒΞΫηεͰ͖ͪΌ͏͕ɻ sub _private_function { !!# } # Ϟδϡʔϧͷ࠷ޙʹ͔ͳΒͣਅΛه͢ɻͦ͏͠ͳ͍ͱ use ͕ࣦഊ͢Δͧɻ 1;
鉮鐄 ˝ VTF.0%6-&GPP CBSךٓةٖ٭ٜמ榟ֻיַ꞊丗ؕ ٤َ٭عך׀ ˝ 儖䎎עֹ㵼娆榫氳ך邾ꥭדֿյ׆ס杼鉮ך㍭םַ ˝ VTFס䌕丗םךⳏ䣆מؕ٤َ٭عיׂٓةٖ٭ٜ ֵ
˝ %BUB%VNQFS+40/םל
؛هةؘؠع䧗⺸ ˝ 1FSMעככ؛هةؘؠع䧗⺸銧鏤כי㡎ױזגׄךע םַסך䏲♀ׄ ˝ ֿյ俊鵟מ✳ֻ ˝ قشآ٭ةכٛنؒٝ٤تֿ־זיַףյׯف٭ך׀
׆׆ך؛هةؘؠع䧗⺸מחַי縒 ֹֻ
؛هةؘؠع䧗⺸כע ˝ ׇׂ癨ⶡמ銧ֻףظ٭ذ啶鵰כ䣆禈׀┉稇מגס ˝ ؛هةؘؠعעؠٚت־榟䡗 ˝ ؛هةؘؠعעظ٭ذ䧏ח ˝ ؠٚتמעظ٭ذמ㵚䣆禈׀ْخشغֿ㲊紶י ַ
1FSMמֽׄ001 001מֽׄ榫鏤 1FSMךס榫鏤 ؠٚت قشآ٭ة ْخشغ قشآ٭ةמ㲊紶ג꞊丗 ؛هةؘؠع قشآ٭ةמCMFTT גٛن
ؒٝ٤ت
CMFTT ˝ CMFTTֿ؛هةؘؠع䧗⺸1FSMמֽׄ僃䏲ס氧㕙☔擻 # ͳΜ͔σʔλ͕͋Δʢී௨ϋογϡϦϑΝϨϯεʣ my $data = { name
!" 'motemen' }; # σʔλʹύοέʔδΛඥ͚Δͱ my $self = bless $data, 'Hatena!#Engineer'; # ϝιου͕ݺΔʂ ͜͜Ͱ Hatena!#Engineer!#tweet $self!$tweet();
͍͍͔ɺΈΜͳ ɹɹɹɹɹɹɹɹ ƅшƅ ) ɹɹɹɹɹɹɹɹ(|ɹy |) ϋογϡϦϑΝϨϯεͱ package Ͱखଓ͖ܕϓϩάϥϛϯά͔͠Ͱ͖ͳ͍͕ ɹɹɹɹɹ
{}ɹ (ƅшƅ)ɹpackage ɹɹɹɹɹɹɹʘʗ|ɹy |ʘʗ ɹɹɹɹೋͭ߹Θ͞ΕOOPͱͳΔ ɹɹɹɹɹɹɹɹ(ƅшƅ)ɹ bless ɹɹɹɹɹɹɹɹ(ʘʗʘʗ
ؤ٤تعٚؠذ ˝ ؤ٤تعٚؠذ舅⮆ך傴ׂն俊鵟עOFXכַֹ⺲⯥✳ֹ ˝ ֿյאַֹֹ⯆硜ֵֿׄךעםַն鷿ֹ⺲⯥סؤ٤تع ٚؠذ⛼׆כך׀
ؤ٤تعٚؠذ package Person; use strict; use warnings; sub new {
my ($class, %args) = !"; return bless \%args, $class; }
✳ַ亠 my $person = Person!"new(age !# 18); # { age
!# 18 } ͕ Person ʹ bless ͞Εͨͷ
✳ַ亠 ˝ 1FSTPOOFX BHF ע1FSTPOOFX 1FSTPO BHF ס矴辉啶乃 ˝
׆ֹזיؠٚتْخشغ㲊紶 ˝ CMFTTיַיـشبٖٛنؒٝ٤تךֵ׆כמ㚺ע םַ ˝ QFSTPO\BHF^ך╈骰מؓؠجت׆כ⺎耆
ْخشغ package Person; use strict; use warnings; sub new {
my ($class, %args) = !"; return bless \%args, $class; } sub age { my ($self) = !"; return $self!#{age}; } sub incr_age { my ($self) = !"; $self!#{age}!$; }
ْخشغ $person!"incr_age; ˝ QFSTPOJODSBHF@עQFSTPOסCMFTT⩝ךֵ1FSTPOג לזיյ磵㷀1FSTPOJODS@BHF QFSTPO כ⺱喋 ˝ ׆ֹזיؕ٤تذ٤تْخشغֿ㲊紶ך׀
ْخشغ⽛צ⭳ױכ״ # ͜ͷೋ͕ͭՁ Class!"method($arg1, $arg2); Class!#method('Class', $arg1, $arg2); # ͜ͷೋ͕ͭՁ
$object!"method($arg1, $arg2); Class!#method($object, $arg1, $arg2);
禆䤔 package Animal; use strict; use warnings; sub new {
!!" } sub walk { !!" } 1; package Dog; use strict; use warnings; use parent 'Animal'; 1;
禆䤔 my $dog = Dog!"new(); $dog!"walk(); # Animal!#walk ͕ݺΕΔ ˝
☼磝ײכיע⺎耆דׄלֵױ僃鲣ע✳יַםַ ˝ 1FSM舅⛮ֿ*%&סئَ٭عׄטַ扛ַׄךעםַ ˝ 邾ꥭמם
؛هةؘؠع䧗⺸ױכ״ ˝ 䣆⛼䚉ֵר؛هةؘؠع䧗⺸ ˝ قشآ٭ةמ䣆禈׀㲊紶 ˝ CMFTTךظ٭ذכ磵צחׄ ˝ ؤ٤تعٚؠذע舅⮆ךחׂյ؛هةؘؠع舅⮆ך⛼ ˝
؛هةؘؠع䧗⺸겧מ⽛צ⭳ֹם矴辉
➘⮵ם$1"/ٓةٖ٭ٜ package Foo; use strict; use warnings; use Class!"Accessor!"Lite (
new !# 1, ro !# ['bar'], ); 1; my $foo = Foo!"new(bar !# 1); # new Ͱ͖ͯΔ $fop!"bar; # bar ϝιουੜ͑ͯΔ
طتع طتع傴ׂؙؤبتطّ׀ה؆כ丝זיַ ˝ QSPWFכַֹطتع㲔车榫סؤُ٤غֿ⺱卲יַ ˝ طتعעUظؔٝؠعٛ♓┖מ糋ׂ ˝ 䦡䍖㯸עU╈骰ע1FSM
طتع use strict; use warnings; use Test!"More; use Person; my
$person = Person!#new(age !$ 18); is $person!#age, 18, '࠷ॳ18ࡀ'; $person!#incr_age; is $person!#age, 19, 'incr_age ݺΜͩΒ19ࡀ'; done_testing;
طتع % prove -Ilib -v t/Person.t t/Person.t !" ok 1
- ࠷ॳ18ࡀ ok 2 - incr_age ݺΜͩΒ19ࡀ 1!"2 ok All tests successful. Files=1, Tests=2, 0 wallclock secs ( 0.01 usr 0.01 sys + 0.04 cusr 0.00 csys = 0.06 CPU) Result: PASS
5FTU$MBTT package t!"Person; use strict; use warnings; use parent 'Test!"Class';
sub setup : Test(setup) { # ͳʹ͔ෆࢥٞͳຐ๏Ͱ໊ؔͷ͋ͱʹΞϊʔςʔγϣϯͰ͖Δ # ֤ςετલͷηοτΞοϓʢมΛΫϦΞͨ͠Γͱ͔ʣ } sub incr_age : Tests { is !!#; }
כַֹ׆כך ˝ 껮ׄ餉דׄל1FSMס㓹灄־؛هةؘؠع䧗⺸وٞءِٚ٤ء ס鎇ױךױג ˝ 1FSMמֽׄ8FCؓوٛס鎇ך׀כ荁־זגׄל侇ꝴ氳 מ☪㍑ע׆׆ױך ˝ 全鶚־ַַز٭ّמ⪌זיַׂ׆כמםױն⼽ס עים炘ל؆ל؆갔זיׂדַ
˝ ײ؆ם⨣ׂ䷷ֻיׂכ䓙ַױ