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.3k
はてなリモートインターン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.2k
はてなインターンシップ2024 RDBMS ブートキャンプ講義資料
hatena
0
940
はてなインターンシップ2024 フロントエンドブートキャンプ講義資料
hatena
0
860
はてなインターンシップ2024 コンテナ講義資料
hatena
0
970
はてなインターンシップ2024 コンテナオーケストレーション講義資料
hatena
0
850
はてなインターンシップ2024 インフラ講義資料
hatena
0
870
はてなインターンシップ2024 AI 講義資料
hatena
0
860
はてなインターンシップ2024 ブログライティング講義資料
hatena
4
3.1k
トップダウン・ボトムアップの両面から作るチーム内マトリクス組織
hatena
0
9
Other Decks in Technology
See All in Technology
あなたの興味は信頼性?それとも生産性? SREとしてのキャリアに悩むみなさまに伝えたい選択肢
jacopen
6
3.2k
Enhancing SRE Using AI
yoshiiryo1
1
280
20250125_Agent for Amazon Bedrock試してみた
riz3f7
2
110
Windows Server 2025 へのアップグレードではまった話
tamaiyutaro
2
260
Grid表示のレイアウトで Flow layoutsを使う
cffyoha
1
150
顧客の声を集めて活かすリクルートPdMのVoC活用事例を徹底解剖!〜プロデザ!〜
recruitengineers
PRO
0
200
【Λ(らむだ)】アップデート機能振り返りΛ編 / PADjp20250127
lambda
0
120
DevSecOps入門:Security Development Lifecycleによる開発プロセスのセキュリティ強化
yuriemori
0
240
もし今からGraphQLを採用するなら
kazukihayase
9
4.2k
[JAWS-UG栃木]地方だからできたクラウドネイティブ事例大公開! / jawsug_tochigi_tachibana
biatunky
0
130
日本語プログラミングとSpring Bootアプリケーション開発 #kanjava
yusuke
2
340
企業テックブログにおける執筆ネタの考え方・見つけ方・広げ方 / How to Think of, Find, and Expand Writing Topics for Corporate Tech Blogs
honyanya
0
820
Featured
See All Featured
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.3k
Learning to Love Humans: Emotional Interface Design
aarron
274
40k
Unsuck your backbone
ammeep
669
57k
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
Designing for humans not robots
tammielis
250
25k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.5k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
52k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Adopting Sorbet at Scale
ufuk
74
9.2k
Statistics for Hackers
jakevdp
797
220k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Being A Developer After 40
akosma
89
590k
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ؓوٛס鎇ך׀כ荁־זגׄל侇ꝴ氳 מ☪㍑ע׆׆ױך ˝ 全鶚־ַַز٭ّמ⪌זיַׂ׆כמםױն⼽ס עים炘ל؆ל؆갔זיׂדַ
˝ ײ؆ם⨣ׂ䷷ֻיׂכ䓙ַױ