์ด ๋ฌธ์๋ ์ผ๋ณธ Hatena ์ฌ์ ์ธํด๊ต์ก์ฉ ๋ฌธ์์ธ Hatena-TextBook์ oop-for-perl ๋ฌธ์ https://github.com/hatena/Hatena-Textbook/blob/master/oop-for-perl.md ๋ฅผ ๋ฒ์ญํ ๊ฒ์ ๋๋ค. ํ์์ ๋ฐ๋ผ ๋ด์ฉ์ ์ถ๊ฐ ๋ฐ ์ฝ๊ฐ์ ์์ ์ด ๊ฐํด์ก์ต๋๋ค. ๋ผ์ด์ผ์ค๋ ์๋ฌธ๊ณผ ๊ฐ์ด Creative Commons license๋ฅผ ๋ฐ๋ฆ ๋๋ค.
(๋ฌธ์ ๋ฒ์ญ์ ๋์์ ์ค @JEEN_LEE๊ตฐ๊ณผ Seoul.pm ์ฌ๋ฌ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค.)
์ด ๋ฌธ์๋ Perl OOP๋ฅผ ์ํ ํต์ฌ๋ง์ ๊ตต์งํ๊ฒ ์ง์ด๋๊ฐ๋ฏ๋ก ๋ถ์กฑํ ์ ์ ๋ค์ ๋ฌธ์๋ฅผ ์ถ๊ฐ๋ก ์ฐธ๊ณ ํ์ธ์.
- Perl ํ๋ก๊ทธ๋๋ฐ ํต์ฌ
- Perl ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
- ํ ์คํธ๋ฅผ ์ฐ์
- ๋์๋ง
- ๊ณผ์ ์ ๋ํด
- CPAN
- ํ๊ณ ์ ํ๋ ๊ฒ์ด ๋๋ถ๋ถ ์ด๋ฏธ ๋ชจ๋ํ๋์ด ์๋ค.
- ๊ทธ๊ฑด CPAN์์ ํ ์ ์์ด
- ํํ๋ ฅ์ด ์ฐ์ํ๋ค
- TMTOWTDI (๋ฐฉ๋ฒ์ ์ผ๋ง๋ ์ง ์๋ค๏ผ)
- ์ด๋ฏธ ๋๋ฆฌ ์ฌ์ฉ๋๊ณ ์๋ค.
- DeNA/NHN/mixi๋ฑ
- ์ข์ ๊ฐ๋ฐ๋ฌธํ๊ฐ ์๋ค.
- http://perl.kr/ : ํ๊ตญ Perl์ธ์ดํธ ๋ชจ์
- https://metacpan.org/ : CPAN ๊ฒ์
- Perl์ ์ฃผ์ํน์ง์ ์ค๋ช
- use strict;use warnings;
- ๋ฐ์ดํฐํ์
- ๋ฌธ๋งฅ/์ปจํ ์คํธ(Context)
- ์ฐธ์กฐ/๋ ํผ๋ฐ์ค(reference)
- ํจํค์ง(package)
- ์๋ธ๋ฃจํด
- ํ์ผ ์์๋ถ๋ถ์ ๋ฐ๋์ ์ฐ์ธ์
use strict;
use warnings;
- ์ ๊ฒ๋ค์ ์ฐ์ง ์๋ ๊ธฐ๋ณธ ๋์์ ๊ณผ๊ฑฐ ํธํ์ฑ์ ์ํด ์ ํ์ฌํญ์ด ์ฝํจ.(์: one-liner)
my $message = "hello";
print $messsage; # typo!
# => ์คํ๋ฅผ ๋ด๋ ์ค๋ฅ๊ฐ ๋ฐ์ ์ํจ!
$messagge = "bye"; # typo!
# => $messagge ์ค๋ฅ ๋ฐ์๏ผ
- Javascript๋ ์ต๊ทผ use strict ๋์ , Python, Ruby์์๋ ์ด๋ฐ ์ฅ์น๊ฐ ์๋ค.
- ์ฌ์ธํ ๋์์ perldoc์ฐธ๊ณ
$ perldoc strict
$ perldoc perllexwarn
- ์ค์นผ๋ผ(scalar)
- ๋ฐฐ์ด(array)
- ํด์(hash)
- ํ์ผํธ๋ค(file handle)
- ํ์ ๊ธ๋ก๋ธ(typeglob)
- 1๊ฐ์ ๊ฐ
- ๋ฌธ์์ด/์ซ์/๋ ํผ๋ฐ์ค
- $calar ๋ก ๊ธฐ์ตํฉ์๋ค.
my $scalar1 = "test";
my $scalar2 = 1000;
my $scalar3 = \@array; # ๋ฐฐ์ด์ ๋ ํผ๋ฐ์ค
- @rray ๋ก ๊ธฐ์ตํฉ์๋ค.
my @array = ('a', 'b', 'c');
- Q:@array์ ๋๋ฒ์งธ ์์๋ฅผ ์ป์ผ๋ ค๋ฉด?
print $array[1]; # 'b'
- ์ค์นผ๋ผ ๊ฐ์ ์ป๋๋ก $๋ก ์ ๊ทผ
- $array์ @array๋ ๋ค๋ฅด๋ค.
$array[0]; # get
$array[1] = 'hoge'; # set
my $length = scalar(@array); # ๊ธธ์ด
my $last_ids = $#array; # ๋ง์ง๋ง ์ธ๋ฑ์ค ๋ฒํธ
my @slice = @array[1..4]; # ์ฌ๋ผ์ด์ค ๋ฐฐ์ด์ ์ธ๋ฑ์ค 1~4์ ๊ฐ
foreach my $e (@array) { # ๋ชจ๋ ์์ ์ํ
print $e;
}
- ์ฒดํฌํด๋์๏ผ
- ์กฐ์ํจ์: push / pop / shift / unshift / map / grep / join / sort / splice
- ๊ด๋ จ๋ชจ๋: List::Util / List::MoreUtils
- %ash ๋ก ๊ธฐ์ตํฉ์๋ค.(%๋ key/value๋ฅผ ์ค์ฌ๋์ ๋ชจ์?)
my %hash = (
perl => 'larry', # => ์์๋ ์ผ๋ฐ์ ์ธ ๋ฌธ์์ด์ผ ๊ฒฝ์ฐ์ ์ธ์ฉ๋ถํธ๊ฐ์๋ ๋ฌธ์์ด(= '"์ด ์๋ bareword)์ด ํ์ฉ๋๋ค.
ruby => 'matz', # Perl์์๋ ๋ค์ ๋จ๋ ,๊ฐ ์์ด๋ ์๊ด์๋ค. ๋ฃ์ด๋์ผ๋ฉด ๋์ค์ ์์๋ฅผ ๋ ์ถ๊ฐํ ๊ฒฝ์ฐ ํธ๋ฆฌํจ
);
#์๋ my %hash = ( 'perl', 'larry', 'ruby', 'matz' ); ์ ๊ฐ๋ค. =>์ ์ฐ๋ฉด ํค,๊ฐ์ฌ์ด ์๊ฐ์ ๊ตฌ๋ณํจ๊ณผ๋ฅผ ๋ํ์ค.
- Q:hash์ key:perl์ ํด๋นํ๋ ๊ฐ์ ์ป์ผ๋ ค๋ฉด?
print $hash{perl}; # larry
print $hash{ruby}; # matz
my @values = @hash{'perl', 'ruby'}; #ํด์์ฌ๋ผ์ด์ค ํค perl,ruby์ ๋ํ ๊ฐ๋ค @์ { }์ ์ฃผ๋ชฉ
- ์ค์นผ๋ผ ๊ฐ์ ์ป๊ธฐ์ํด $์ ์ฌ์ฉ
- $hash์ %hash๋ ๋ค๋ฅธ ๋ณ์
- {} ์์ ํค์ง์ ์ ์ผ๋ฐ์ ์ธ ๋ฌธ์์ด์ผ ๊ฒฝ์ฐ์ ์ธ์ฉ๋ถํธ๊ฐ์๋ ๋ฌธ์์ด(= '"์ด ์๋ bareword)์ด ํ์ฉ๋๋ค.
$hash{perl}; # get
$hash{perl} = 'larry'; # set
for my $key (keys %hash) { # ์ ์์ ํค์๋ํด ์ํ
my $value = $hash{$key};
}
- ์ฒดํฌํด๋์๏ผ
- ํจ์: keys / values / delete / exists / each
- ์ค์นผ๋ผ - $ /๋ฐฐ์ด - @ /ํด์ - %
- $val๊ณผ @val๊ณผ %val์ ๋ค๋ฅธ ๋ณ์
$ perldoc perldata
- Perl์๋ ์ปจํ ์คํธ๋ผ๋ ๊ฒ์ด ์๋ค.
- ๋ํ์ ์ธ ํน์ง
- ์์ด ํ๊ฐ๋๋ ์ฅ์(= ์ปจํ ์คํธ)์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ณํจ
my @x = (0,1,2);
my ($ans1) = @x;
my $ans2 = @x;
- ๊ฐ๊ฐ ๋ฌด์์ด ๋ค์ด๊ฐ๊น?
my @x = (0,1,2);
my ($ans1) = @x; # => 0
my $ans2 = @x; # => 3
- ๋ฐฐ์ด/๋ฆฌ์คํธ์ ๋ํ ํ ๋น์ ์ฐ๋ณ์ ๋ฆฌ์คํธ ์ปจํ
์คํธ
- 0์ด ํ ๋น๋๋ค. 1,2๋ ๋ฒ๋ ค์ง(void context)
- ์ค์นผ๋ผ์ ๋ํ ํ ๋น์ ์ฐ๋ณ์ ์ค์นผ๋ผ ์ปจํ
์คํธ
- ๋ฐฐ์ด์ด ์ค์นผ๋ผ ์ปจํ ์คํธ์์ ํ๊ฐ๋๋ฉด ๊ธธ์ด๋ฅผ ๋ฐํ
- <์ฌ๊ธฐ>์ ์ปจํ ์คํธ๋ ์ค์นผ๋ผ, ๋ฆฌ์คํธ์ค ์ด๋ค ๊ฒ์ผ๊น?
sort <์ฌ๊ธฐ>;
length <์ฌ๊ธฐ>;
if (<์ฌ๊ธฐ>) { }
for my $i (<์ฌ๊ธฐ>) { }
$obj->method(<์ฌ๊ธฐ>);
my $x = <์ฌ๊ธฐ>;
my ($x) = <์ฌ๊ธฐ>;
my @y = <์ฌ๊ธฐ>;
my %hash = (
key0 => 'hoge',
key1 => <์ฌ๊ธฐ>,
);
scalar(<์ฌ๊ธฐ>);
<์ฌ๊ธฐ>;
sort <์ฌ๊ธฐ>; # sortํจ์ ๋ค๋ ๋ฆฌ์คํธ์ปจํ
์คํธ
length <์ฌ๊ธฐ>; # lengthํจ์ ๋ค๋ ๋ฌธ์์ด์ด ์ค๋ฏ๋ก ์ค์นผ๋ผ์ปจํ
์คํธ
if (<์ฌ๊ธฐ>) { } # ์ฐธ,๊ฑฐ์ง์ด ๋ค์ด๊ฐ๋ ๊ณณ์ ๋ถ๋ฆฌ์ธ(boolen)์ปจํ
์คํธ๋ผ๊ณ ํ๋ฉฐ ์ค์นผ๋ผ์ปจํ
์คํธ์ ์ผ์ข
์ด๋ค.
foreach my $i (<์ฌ๊ธฐ>) { } # ๋ฃจํ๋ก ๋๊ธธ ๊ฒ๋ค์ด ๋ค์ด๊ฐ๋ฏ๋ก ๋ฆฌ์คํธ์ปจํ
์คํธ
$obj->method(<์ฌ๊ธฐ>); # ๋ฉ์๋์ ์ธ์๋ค์ด ๋ค์ด๊ฐ๋ฏ๋ก ๋ฆฌ์คํธ์ปจํ
์คํธ
my $x = <์ฌ๊ธฐ>; # ์ค์นผ๋ผ์ปจํ
์คํธ
my ($x) = <์ฌ๊ธฐ>; # ๋ฆฌ์คํธ์ปจํ
์คํธ
my @y = <์ฌ๊ธฐ>; # ๋ฆฌ์คํธ์ปจํ
์คํธ
my %hash = (
key0 => 'hoge',
key1 => <์ฌ๊ธฐ>, # ๋ฆฌ์คํธ์ปจํ
์คํธ
);
scalar(<์ฌ๊ธฐ>); #์ค์นผ๋ผ์ปจํ
์คํธ
<์ฌ๊ธฐ>; # ๋ฆฌ์คํธ์ปจํ
์คํธ
- ์/๊ฐ์ด ๊ณ์ฐ๋๋ ์์น์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ณํจ
- ์ปจํ
์คํธ์ ๊ฒฐ์ ๋ฐฉ๋ฒ์ ๊ธฐ์ตํด์ผ ํ๋ค.
- ๋ด์ฅํจ์๋ค์ ์ธ์ ๋ถ๋ถ ์ฃผ์ (length ๋ฑ)
- ๋ด์ฅํจ์ ์ด์ธ์๋ prototype์ด๋ผ๋ ๊ธฐ๋ฅ์ผ๋ก ์ง์ ๊ฐ๋ฅํ๋ฏ๋ก ์ฃผ์
$ perldoc perldata
$ perldoc perlsub # Prototype ์ฐธ๊ณ ๋ฌธ์
- ์ค์นผ๋ผ/๋ฐฐ์ด/ํด์ ๋ฑ์ ๋ํ ๋ ํผ๋ฐ์ค
- C++์ ๋ ํผ๋ฐ์ค๋ฅผ ์๊ฐ/Ruby๋ฑ์์๋ ๋ชจ๋ ๊ฒ์ด ๋ ํผ๋ฐ์ค
- ๋ฐ์ดํฐ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๋ ๋งค์ฐ ์ค์ํจ
- ํ๋ ฌ์ ๋ง๋ค์ด ๋ณด์
my @matrix = (
(0, 1, 2, 3),
(4, 5, 6, 7),
);
- ์ด๋ป๊ฒ ๋ ๊น?
my @matrix =
(0, 1, 2, 3, 4, 5, 6, 7);
- ํ
my %entry = (
body => 'hello!',
comments => ('good!', 'bad!', 'soso'),
)
- ์ด๋ป๊ฒ ๋ ๊น?
my %entry = (
body => 'hello!',
comments => 'good',
'bad!' => 'soso',
);
- ํ
- ()์์ ๋ฆฌ์คํธ ์ปจํ ์คํธ
- ๋ฆฌ์คํธ ์ปจํ ์คํธ์์ ๋ฆฌ์คํธ๋ ํ๋ ค๋ฒ๋ฆผ(flatten). Perl์์ ๊ดํธ๋ ํ๊ฐ์ ์ฐ์ ์์๋ฅผ ๋์ด๋ ๊ธฐ๋ฅ๋ง ํ๋ค.
my @matrix = (
(0, 1, 2, 3),
(4, 5, 6, 7),
);
my @x = (1,2,3);
my $ref_x1 = \@x;
# ์ฃผ์! my @x = \(1,2,3);๋ (\1,\2,\3)์ด๋ค. ์์ ๋ฐฐ์ด๋ ํผ๋ฐ์ค \@x์๋ ๋ค๋ฆ
# ์ค์ด๋ฉด
$ref_x2 = [1,2,3];
# ์ด๋ ๊ฒ๋
$ref_x3 = [@x]; # ์ด ๊ฒฝ์ฐ๋ @x๊ฐ [ ]์์ ๋ฆฌ์คํธ์ปจํ
์คํธ์์ ํ์ฅ๋์ด @x์ ๋ ํผ๋ฐ์ค๊ฐ ์๋๋ผ ๋ด์ฉ์ด ๋ณต์ฌ๋์ด [1,2,3]์ด ๋๋ค.
๋ ํผ๋ฐ์ค๋ฅผ ์ผ๋ฐ์ ์๋ฃํ์ผ๋ก ๋๋๋ฆฌ๋ ์์
use 5.010;
my $scalar_ref = \5;
say $scalar_ref; # SCALAR(0x1c6fc74) ๋ ํผ๋ฐ์ค๊ฐ ์์นํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ์ฐํ
say ${$scalar_ref}; # 5 ${$scalar_ref}๋ $$scalar_ref๋ก ๊ฐ๋ตํ ๊ฐ๋ฅ
my $array_ref = [2,3,4];
say $array_ref; # ARRAY(0x70ba8c)
say @{$array_ref}; # 234 @{$array_ref}๋ @$array_ref๋ก ๊ฐ๋ตํ ๊ฐ๋ฅ
say ${$array_ref}[0]; # 2 ${$array_ref}[0]๋ $$array_ref[0]์ $array_ref->[0]์ผ๋ก ๊ฐ๋ตํ ๊ฐ๋ฅ
- ํํ์ ๊ท์น:
์ํ๋๋ณ์ํ_๋๋ ํผ๋ฐ์คsigil { ๋ ํผ๋ฐ์ค } ํ์ํ ๊ฒฝ์ฐ_์ธ๋ฑ์ค๋ ํค
- ์ฐ์ ์์์ ๋ฌธ์ ์์ ๊ฒฝ์ฐ ๋ ํผ๋ฐ์ค๋ฅผ ๊ฐ์ธ๋ { }๋ ์๋ต๊ฐ๋ฅ(์ธ๋ฑ์ค๋ ํค๋ ๋๋ ํผ๋ฐ์คsigil์ค sigil์ด ๋จผ์ ๊ฒฐํฉํ๋ค.)
- ${$array_ref}[index] ๋
$array_ref->[index], $ {$hash_ref}{key} ๋ $hashref->{key}๋ก ๋์ฒด ๊ฐ๋ฅ - ์ธ๋ฑ์ค๋ ํค๋ฅผ ์ง์ ํ๋ ๋ฐฐ์ด์ด๋ ํด์์ ๋๋ ํผ๋ฐ์ค์ ๊ฒฝ์ฐ ->๋ฅผ ์ฌ์ฉํ ํํ๊ฐ ์ง๊ด์ ์ด๊ณ ๋๋ฆฌ ์ฌ์ฉ๋จ
my $ref_x = [1,2,3];
my @x = map { $_ * 2 } @$ref_x;
print $ref_x->[0]; # 1 ${$ref_x}[0]๊ณผ ๊ฐ๋ค. ${$array_ref}[์ธ๋ฑ์ค] ๋ $array_ref->[์ธ๋ฑ์ค] ๋ก ๋ํ๋ผ ์ ์์
my @new_x = @$ref_x;
print $new_x[0]; # 1
my %y = (
perl => 'larry',
ruby => 'matz',
);
my $ref_y1 = \%y;
# ์ค์ด๋ฉด
$ref_a2 = {
perl => 'larry',
ruby => 'matz',
}
my $ref_y = {
perl => 'larry',
ruby => 'matz',
};
my @keys = keys %$ref_y;
print $ref_y->{perl}; # larry ${$ref_y}{perl}๊ณผ ๊ฐ๋ค. ${$hash_ref}{ํค} ๋ $hash_ref->{ํค} ๋ก ๋ํ๋ผ ์ ์์
my %new_f = %$ref_y;
print $new_f{perl}; # larry
- ๋ ํผ๋ฐ์ค๋ ์ค์นผ๋ผ๊ฐ์ด๋ค.(๋ ํผ๋ฐ์ค๋ ๋ฉ๋ชจ๋ฆฌ์์ ์์นํ ์ฃผ์๋ฅผ ๋ํ๋์ ์๊ธฐ) = ๋ฆฌ์คํธ ์ปจํ ์คํธ๋ก ํ์ฅ๋์ง ์์
my $matrix = [
[0, 1, 2, 3],
[4, 5, 6, 6],
];
# 5์ ์ ๊ทผํ๋ ค๋ฉด? ์ฐจ๋ก๋ก ๊น๋ฉด ${${$matrix}[1]}[1] ํ์ดํ ํ๊ธฐ๋ก ํ๋ฉด $matrix->[1]->[1]
# $matrix->[1]->[1] ๋ $matrix->[1][1] ๋ก ๊ฐ๋ฅํ๋ค.( ์ฐ์์ ์ธ ์ธ๋ฑ์ค, ํค ์ง์ ์ฌ์ด์ ->๋ ์๋ต๊ฐ๋ฅ )
my @matrix2 = (
[0, 1, 2, 3],
[4, 5, 6, 6],
);
# 5์ ์ ๊ทผํ๋ ค๋ฉด? ์ฐจ๋ก๋ก๊น๋ฉด ${$matrix2[1]}[1] ํ์ดํ ํ๊ธฐ๋ก ํ๋ฉด $matrix2[1]->[1]
# ์์ ๊ท์น์ ์ํ์ฌ ->๋ ์๋ต๊ฐ๋ฅ ํ๋ฏ๋ก $matrix2[1][1] ๋ก ์ค์ฌ ์ธ ์ ์์
# ๋ ํผ๋ฐ์ค๋ก ๋ง๋ ํ๋ ฌ $matrix, ๋ฐฐ์ด๋ก ๋ง๋ ํ๋ ฌ @matrix2์ ์ฐจ์ด์ ์ ํ์ธํ ๊ฒ
my $entry = {
body => 'hello!',
comments => ['good!', 'bad!', 'soso'],
};
# good!์ ์ ๊ทผํ๋ ค๋ฉด? ์ฐจ๋ก๋ก ๊น๋ฉด ${${$entry}{comments}}[0] ํ์ดํ ํ๊ธฐ๋กํ๋ฉด $entry->{comments}->[0]
- ์: ๋ ํผ๋ฐ์ค๋ฅผ ๋ฐํํ๋ ๋ฉ์๋์ ๋ฐํ๊ฐ์ ๋๋ ํผ๋ฐ์ค
my $result = [
map {
$_->{bar}; #๊ฐ ๋ฐฐ์ด์์(ํด์๋ ํผ๋ฐ์ค)๋ฅผ ๋๋ ํผ๋ฐ์ค
}
@{ $foo->return_array_ref } #๋ฐฐ์ด๋ ํผ๋ฐ์ค ๋ฐํ
# โ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ๋ค.
];
- ์ด๋ค ๋ณ์๋ก ์ฐ๋ ๋ณ์๋ช
์ ๊ทธ ์ด์ธ ์๋ฃํ ๋ณ์๋ช
์ผ๋ก ์ฌ์ฉํ์ง ๋ง๊ฒ
- ๊ตฌ๋ณ์ด ์ด๋ ต๋ค.
my @foo = (1, 2, 3);
my %foo = ( a => 1, b => 2, c => 3);
$foo[1], $foo{a}
# โ ์ผํ๋ณด๋ฉด ๋์ผํ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ ๊ฐ์ด ํผ๋๋๋ค.
# ์ค์ ๋ก๋ ๋ค๋ฅธ ๋ณ์
my $foo = [1, 2, 3];
my $foo = { a => 1, b => 2, c => 3};
# โ ๊ฐ์ ๋ณ์์ด๋ฏ๋ก warning์ด ๋์จ๋ค.
ํ์ํ ๊ฒฝ์ฐ ๋๋ ํผ๋ฐ์คํ๋ค.
my $list = [1, 2, 3];
push @$list, 4; # push๋ ์ฒซ๋ฒ์งธ ์ธ์๋ก ๋ฐฐ์ด์ ๋ฐ์ผ๋ฏ๋ก
- ์๋ธ๋ฃจํด ์ธ์์ฒ๋ฆฌ
- ์ฌ๋ฌ ๊ฐ์ ๋ฐํํ ๋
sub hello {
my ($arg1, $arg2, %other_args) = @_;
return ($arg1, $arg2);
}
my ($res1, $res2)
= hello('hey', 'hoy', opt1 => 1, opt2 =>2);
- ์ค์นผ๋ผ/๋ฐฐ์ด/ํด์์ ๋ํ ์ฐธ์กฐ
- ๋ณต์กํ ๋ฐ์ดํฐ๊ตฌ์กฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ํ์
- ํ๊ธฐ๋ฒ์ด ๋ค์ ๋ณต์ก
$ perldoc perlreftut
$ perldoc perlref
- ๋ค์์คํ์ด์ค/์ด๋ฆ๊ณต๊ฐ
- ๋ชจ๋ ๋ก๋ฉ ๋ฐฉ๋ฒ
- ํด๋์ค(ํ์ ์ค๋ช )
package Hoge;
our $PACKAGE_VAL = 10;
# $HOGE::PACKAGE_VAL == 10
sub fuga {
}
# &Hoge::fuga;
1;
use My::File;
# => My/File.pm ๊ฐ ๋ก๋๋จ
- @INC(๊ธ๋ก๋ฒ ๋ณ์)์ ์ค์ ๋ ๊ฒฝ๋ก๋ฅผ ๊ฒ์
use lib 'path/to/your/lib';
$ perl -Ipath/to/your/lib;
- path/to/your/lib/My/File.pm ์ ์ฐพ์์ ์์ผ๋ฉด ๋ก๋ฉ
&hello # ์๋ธ๋ฃจํด ์ ์๋ถ๋ถ ์ด์ ๊ดํธ์์ด ํธ์ถํ๋ ค๋ฉด &๋ฅผ ๋ถ์ฌ์ผ ํ๋ค.
sub hello {
my ($name) = @_; # ํธ์ถ์ ์ธ์๊ฐ ์๋ค๋ฉด @_์ ์๋์ผ๋ก ์ ๋ฌ ์ธ์๋ค์ด ๋ค์ด๊ฐ
return "Hello, $name";
}
hello(); # ๊ดํธ๋ฅผ ๋ถ์ด๋ฉด ์๋ค ์๊ด์์(์ ์์ ์ธ ๋ฐฉ๋ฒ)
hello; #์ ์ ํ ๋ผ๋ฉด ๊ดํธ ์์ด๋ ํธ์ถ๋จ
sub func1 {
my ($arg1, $arg2, %args) = @_; #ํด์๋ก ์ด๋ฆ์๋ ์ธ์๋ฅผ ํ๋ด๋ผ ์ ์๋ค.
my $opt1 = $args{opt1};
my $opt2 = $args{opt2};
}
func1('hoge', 'fuga', opt1 => 1, opt2 => 2);
sub func2 {
my $arg1 = shift; # ๋ช
์์ ์ผ๋ก ํ๋ฉด shift @_;์ด๋ @_๋ฅผ ์๋ตํด๋ @_์์ ์ฐจ๋ก๋ก ๊ฐ์ ธ์ค๋ฏ๋ก ๊ด๋ก์ ์ผ๋ก ์ฐ๋ ํํ
my $arg2 = shift;
my $args = shift; # ์ฌ๊ธฐ๋ ์ต๋ช
ํด์๋ ํผ๋ฐ์ค๊ฐ ๋ค์ด์จ๋ค.
# ์ 3์ค์ my ($arg1, $arg2, $args) = @_; ๋ก ํด๋ ๋๋ค.
my $opt1 = $args->{opt1};
my $opt2 = $args->{opt2};
}
func2('hoge', 'fuga', {opt1 => 1, opt2 => 2});
sub func3 { shift->{arg1} } # shiftํ ์ธ์์ ๋ํด ๋ฐ๋ก ์ ์ฉ, func3({arg1 => 2}) ์ด๋ฐ์์ผ๋ก ํธ์ถํ์๋?
sub func4 { $_[0]->{arg1} } # @_ ์ ์ฒซ์งธ ์์๋ $_[0](@a์ ์ฒซ์งธ์์๋ $a[0]์ธ ๊ฒ๊ณผ ๊ฐ์ ์ด์น)
- ํจํค์ง๋ด์ ์ ์
package Greetings;
sub hello { }
1;
# hello ๋ &Greetings::hello(); ๋ก ์ ์๋๋ค.
- ์๋ฒ๋ฃจํด ์ ์๋ฅผ ์ค์ฒฉํด๋ ์์๋ค์์คํ์ด์ค(ํจํค์ง)์ ์ ์๋จ. ์ฃผ์
package Greetings;
sub hello {
sub make_msg { }
sub print {}
print (make_msg() );
}
1;
# &Greetings::hello();
# &Greetings::make_msg();
# &Greetings::print();
- use Data::Dumper; ์ ํํ ์ฌ์ฉํ๋ค.
use Data::Dumper;
print Dumper($value); # ์ค์นผ๋ผ๊ฐ์ ๋ฃ๋๊ฒ ์ข๋ค. ๋ฐฐ์ด์ด๋ฉด \@array ์ด๋ฐ์์ผ๋ก ์ค์นผ๋ผ๊ฐ(๋ ํผ๋ฐ์ค)์ผ๋ก ๋ง๋ค์ด์
- ์๋ํฐ์ ๋งคํฌ๋ก์ ์ ์ํด ๋๊ณ ์ฐ๋ฉด ์ ์ฉ
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ์ ์ด ์์ต๋๊น?
- Perl์ด์ธ ์ธ์ด ํฌํจ
- ์ถ์ํ๋
๋ณต์กํ ์๋ฃ, ๋ชจ๋, ์์คํ
๋ฑ์ผ๋ก๋ถํฐ ํต์ฌ์ ์ธ ๋ถ๋ถ์ ๊ฐ์ถ๋ ค ๋ด๋ ๊ฒ (Wikipedia๋ฐ์ท)
- ํ๋ฒ์ ์๊ฐํ๊ณ ๊ณ ๋ คํด์ผ ๋๋ ๋ถ๋ถ์ ์ค์ด์ค๋ค.
- ๋ฒ์๋ฅผ ์ขํ์ค๋ค.
- ์ ์ง๋ณด์์ฑ/์ฌํ์ฉ์ฑ์ ๋์ธ๋ค.
- gotoํ๋ก๊ทธ๋๋ฐ
- ์ ์ด์ ํ๋ฆ์ด ์์ ์์ ๋ก์
- Perl์์ gotoํ๋ก๊ทธ๋๋ฐ ์(fizzbuzz)
my $i = 1;
START:
goto "END" if $i > 35;
goto "PRINT_FIZZBUZZ" if $i % 15 == 0;
goto "PRINT_FIZZ" if $i % 3 == 0;
goto "PRINT_BUZZ" if $i % 5 == 0;
goto "PRINT_NUM";
PRINT_NUM:_
print $i;
goto "PRINT_NL";
PRINT_FIZZ:_
print "fizz";
goto "PRINT_NL";
PRINT_BUZZ:_
print "buzz";
goto "PRINT_NL";
PRINT_FIZZBUZZ:_
print "fizzbuzz";
goto "PRINT_NL";
PRINT_NL:_
print "\n";
$i++;
goto "START";
END:
- ์ ์ด์ ํ๋ฆ์ ์ดํดํ๊ธฐ ํ๋ค๋ค.
- ํ๋ก๊ทธ๋จ ์ ์ฒด๋ฅผ ํ๋ฒ์ ์ดํดํ์ง ์์ผ๋ฉด ์๋๋ค.
- ๋๊ท๋ชจ ์ํํธ์จ์ด๋ฅผ ์ ์งํ๊ธฐ ํ๋ค๋ค.
- ์ฝ๋ ์ฌ์ฌ์ฉ์ด ํ๋ค๋ค.
EW Dijkstra(1968). Go to statement considered harmful
- ์์ฐจ, ์ ํ, ๋ฐ๋ณตํํ
- ์๋ธ๋ฃจํด์ ์ํด ํ์๋ฅผ ์ถ์ํ
sub fizzbuzz {
my $i = 1;
while ($i < 35) {
if ($i % 15 == 0) {
print "fizzbuzz";
}
elsif ($i % 3 == 0) {
print "fizz";
}
elsif ($i % 5 == 0) {
print "buzz";
}
else {
print $i;
}
print "\n";
$i++;
}
}
fizzbuzz();
- ํ์์ ๋ฐ์ดํฐ๊ฐ ๊ด๊ณ๊ฐ ๋ถ๋ฆฌ๋จ
open my $fh, '<', $filename;
while (my $line = readline($fh)) {
print $line;
}
close $fh;
- $fh์ ๋ํด ์ด๋ค ์์ ์ ํ ์ ์๋๊ฐ?
- open/close/readline ์ผ๋ก ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ ์ ์๋๊ฐ?
- ๋ฐ์ดํฐ, ํ์ ๊ฐ๊ฐ์ ๋ฒ์๊ฐ ๋๋ค.
-
๊ฐ์ฒด์ ์ถ์ํ
-
๊ฐ์ฒด๋
- ํ๋ก๊ทธ๋จ์ ๋์์ด ๋๋ ๋ฌผ๊ฑด
- ๋ฐ์ดํฐ + ํ์
-
ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๊ฐ์ ์ํธ์์ฉ
-
"์ด๋ป๊ฒ"๋ณด๋ค๋ "๋ฌด์์ด ์ด๋ป๊ฒ"์ ์ฃผ๋ชฉ
- ์ฒ๋ฆฌ์ ๋์(๋ฐ์ดํฐ)์ ์ฒ๋ฆฌ๋ด์ฉ(ํ์)๊ฐ ์ฐ๊ฒฐ๋์ด ์๋ค.
- ๊ฐ์ฒด๊ฐ ์ฝ๋๋ฅผ ์ดํดํ๋ค.
- ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- ๊ฐ์ฒด๋ผ๋ ๋น์ ๊ฐ ์ธ๊ฐ์๊ฒ ์ต์ํ๋ค.
- => ๋์์ธํ๊ธฐ ์ฝ๋ค.
use IO::File;
my $file = IO::File->new($filename, 'r');
while (my $line = $file->getline) {
print $line;
}
$flie->close;
- $file์ ๋ํ ๋ชจ๋ ํ์๊ฐ ๋ฉ์๋๋ก ์ ์๋์ด ์์.
- ๊ฐ์ฒด ๊ฐ์ ์ํธ ์์ฉ / ๋ฉ์์ง ์ ๋ฌ
- ๊ฐ์ฒด ๊ฐ์ ์ํธ ์์ฉ์ ํํํ๊ธฐ ์ฝ๋๋ก ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์ง์
- ํด๋์ค์ ์ธ์คํด์ค
- ์บก์ํ
- ์์
- ๋คํ์ฑ
- ๋์ ๋ฐ์ธ๋ฉ
ํด๋์ค : [๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ์ + ํ์ ์ ์]
โใ์์ฑ
์ธ์คํด์ค : [{data} + ํ์์ ๋ํ ๋ ํผ๋ฐ์ค(์ฐธ์กฐ)]
- ํด๋์ค: ํจํค์ง
- ๋ฉ์๋: ํจํค์ง์ ์ ์ ๋ ํจ์
- ๊ฐ์ฒด: ํน์ ํจํค์ง์ bless() ๋ ๋ ํผ๋ฐ์ค
- ๊ณผ์ ๋ก ๋์จ Sorter ํด๋์ค(๊ฐ๋ต ํ)
์๋๋ฅผ Sorter.pm ์ด๋ ํ์ผ๋ก ๋ง๋ค์
# ํจํค์ง ์ ์ฐจ๋ฅผ ์ ์
package Sorter; # ํด๋์ค ์ด๋ฆ
use strict;
use warnings;
# ์ฝ๋ ๊ณ์
# ์์ฑ์
# Sorter->new; ์ฒ๋ผ ํธ์ถ, ์ด๋ ๊ฒ ํธ์ถํ๋ฉด ์ฒซ๋ฒ์งธ ์ธ์๋ก Sorter๊ฐ ๋์ด๊ฐ๋ค.
# Sorter->new;๋ ๋ด๋ถ์ ์ผ๋ก Sorter::new('Sorter') ์ฒ๋ผ ํธ์ถ๋๋ค. ์ฒซ๋ฒ์ฌ ์ธ์๋ก ํด๋์ค ์ด๋ฆ์ด ๋์ด๊ฐ๋ ์ด์
sub new {
my ($class) = @_; # ํด๋์ค์ด๋ฆ(์ด ๊ฒฝ์ฐ์ Sorter)์ด ๋ค์ด๊ฐ
# ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๋ค.
my $data_structure = {
values => [],
};
# ํ์(= ํจํค์ง)์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ๋
my $self = bless $data_structure, $class; # $data_structure๋ฅผ $class์ด๋ฆ(Sorter)๋ก ํ
๊น
ํ์ฌ ๊ฐ์ฒดํ
return $self; # $self๋ ๋ค๋ฅธ ๋ณ์๋ช
์ผ๋ก ์จ๋ ๋์ง๋ง python์์ ์ฒ๋ผ ๊ด์ฉ์ ์ผ๋ก self๋ก ์ด๋ค.
}
# ์์์ bless๋ ํด๋์ค ์ด๋ฆ์ $data_structure์ ํ
๊น
ํ์ฌ ๊ทธ ๋ ํผ๋ฐ์ค๋ฅผ ๋ฆฌํดํ๋ฏ๋ก
# ๊ฒฐ๊ตญ bless๋ $data_sturcture์ $self๋ ๊ฐ๋ค.
# bless ํ๊ธฐ์ ์ ๋ณ์์ ํ์
์ ์์๋ณด๋ ref ํจ์๋ฅผ ์ฌ์ฉํ์ฌ print ref $data_structure ํ๋ฉด HASH ๋ผ๊ณ ๋์ค์ง๋ง
# bless ํด์ ๊ฐ์ฒดํ ํ ํ์๋ ์ฐ์ด๋ณด๋ฉด Sorter๊ฐ ๋์จ๋ค.
# ์ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์จ๋ ๋๊ฐ๋ค. ์๋ฆฌ๋ฅผ ์ดํดํ๋ฉด ์ด๋ค ๋ชจ์์ด๋ ํผ๋์๋จ
# ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๋ ํํ
# sub new {
# my ($class) = @_;
# my $self = {
# values => [],
# };
# bless $self, $class;
# return $self;
# }
# ๊ทน๋๋ก ์ค์ด๋ฉด?
# sub new {
# return bless { values => [] }, shift;
# }
# ์ฝ๋ ๊ณ์
# $sorter->set_values(0,1,2,3) ์ ๊ฐ์ด ํธ์ถ
# ๋ด๋ถ์ ์ผ๋ก๋ Sorter::set_values($sorter,0,1,2,3)์ฒ๋ผ ํธ์ถ๋๋ค. ์ฒซ๋ฒ์งธ ์ธ์์ $sorter๊ฐ ๋ค์ด๊ฐ๋ ์ด์
sub set_values {
my ($self, @values) = @_; # $self์๋ $sorter๊ฐ ๋ค์ด๊ฐ
$self->{values} = [@values];
return $self;
}
sub get_values {
my ($self) = @_;
return @{ $self->{values} };
}
sub sort {
my ($self) = @_;
$self->{values} = [ sort { $a <=> $b } @{ $self->{values} } ];
}
1; # ๋ณ๋์ ํ์ผ๋ก ํจํค์ง ๋ชจ๋์ ๋ง๋ค๊ฒฝ์ฐ ์ ๋ก๋ฉ๋์๋ค๊ณ ์๋ฆฌ๊ธฐ ์ํด ํ์ผ ๋์ ์ฐธ(true)๊ฐ์ ๋ฃ์
์ฌ๊ธฐ๊น์ง๊ฐ Sorter.pm
use Sorter;
my $sorter = Sorter->new;
$sorter->set_values(5,4,3,2,1);
package Sorter;
...
# ๋ณ๋์ .pm ํ์ผ์ด ์๋๋ผ ๋์ 1;์ ํ์์๊ณ ๋ค๋ฅธ ํจํค์ง๊ฐ ์ ์ธ๋๋ฉด ํด๋นํจํค์ง ์์ญ์ ๋๋๋ค.
package main; # ์คํฌ๋ฆฝํธ ์คํ ์ฝ๋๊ฐ ์คํ์์๋๋ ๊ธฐ๋ณธ ํจํค์ง๋ mainํจํค์ง
# ์ด๋ฏธ Sorterํจํค์ง๊ฐ ํํ์ผ ์์ ์์ด ๋ก๋ฉ๋ ์ํ์ด๋ฏ๋ก ๋ฐ๋ก use Sorter;๋ฅผ ํด์ค ํ์๋ ์๋ค.
my $sorter = Sorter->new;
$sorter->set_values(5,4,3,2,1);
ํจํค์ง์์ญ์ ํด๋น ํจํค์ง๊ฐ ์ ์ธ๋ ๋ ์์ปฌ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ์ข ๋ฃ๋๋ฏ๋ก ๋ธ๋ญ { }์ผ๋ก ๋ฌถ์ด์ ์ด๋ ๊ฒ ํด๋ ๋๋ค.
# ์ฌ๊ธฐ๋ ๊ธฐ๋ณธ main ํจํค์ง ์์ญ
{
package Sorter;
...
}
# ๋ค์ ๊ธฐ๋ณธ main ์์ญ
# { }์ ์ํด ์ฌ๊ธฐ์๋ ๋ช
์ํ์ฌ ํจํค์ง๋ฅผ ๋ฐ๊พธ์ง ์์๋ main์์ญ์
# ๋ธ๋ญ์ผ๋ก ๋ฌถ์ผ๋ฉด ์๋ก ๋ค๋ฅธ ํจํค์ง๊ฐ์ ๋ ์์ปฌ์์ญ์ ํ์คํ ๊ตฌ๋ถํ์ฌ ๋ด๋ถ๋ณ์๋ฑ์ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ ๋ค.
my $sorter = Sorter->new;
$sorter->set_values(5,4,3,2,1);
- ์์ฑ์๋ ์๋์ผ๋ก(๊ด๋ก์ ์ผ๋ก new๋ผ๋ ์ด๋ฆ์ผ๋ก) ์ ์
- ๊ฐ์ฒด๋ฅผ ์ค์ค๋ก ๋ง๋ฆ
- new()
- ๋ ํผ๋ฐ์ค๋ฅผ ํด๋์ค(ํจํค์ง)์ด๋ฆ์ผ๋ก bless๋ฅผ ํตํด ํ ๊น ํ์ฌ ๋ฐํ
- bless์ ๋ฐ์ดํฐ์ ํ์(๋ฉ์๋)๋ฅผ ๋ฌถ๋ ์์
my $self = bless { field => 1 }, "Sorter";
- ๋ฌธ๋ฒ์ ์ธ ์ฐจ์ด๋ ์๋ค.
- ์ ์์: ์ 1์ธ์๋ฅผ $class๋ก ํ ์ง $self๋ก ํ ์ง
- ํธ์ถ์: ํด๋์ค์์ ํธ์ถํ๊ฑฐ๋ ์ธ์คํด์ค๊ฐ์ฒด์์ ํธ์ถํ๊ฑฐ๋.
Class->method($arg1, $arg2);
&Class::method("Class", $arg1, $arg2);
$object->method($arg1, $arg2);
&Class::method($object, $arg1, $arg2);
- 1์ธ์คํด์ค์ 1๋ฐ์ดํฐ(๋ ํผ๋ฐ์ค)
- ์ฌ๋ฌ ํด๋์ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์ถ๋ค๋ฉด ํด์ ๋ ํผ๋ฐ์ค๋ฅผ bless ํจ.(๋๋ฌผ๊ฒ ์ฐ์ง๋ง ์ค์นผ๋ผ ๋ ํผ๋ฐ์ค,๋ฐฐ์ด ๋ ํผ๋ฐ์ค๋ bless๊ฐ๋ฅํจ)
my $self = bless {
filed1 => $obj1,
field2 => [],
field3 => {},
}, $class;
- ๊ณต๊ฐ์ฌ๋ถ ์ง์ (public/private๋ฑ) ์ ์๋ค.
- ๋ชจ๋ public
- ๋ช ๋ช ๊ท์น์ผ๋ก ๊ด๋ก์ ์ผ๋ก ๊ณต๊ฐ์ฌ๋ถ๋ฅผ ๊ตฌ๋ณํ๋ค.(python ์ฒ๋ผ)
sub public_method {
my $self = shift;
}
sub _private_method {
my $self = shift;
}
- ํ์ํ๋ค๋ฉด ์์ ํ ์จ๊ธฐ๋ ๋ฐฉ๋ฒ๋ ์๊ธดํ๋ค.(ํด๋ก์ ๋ฅผ ์ฌ์ฉ)
- use parent; ์ฌ์ฉ(์ฝ๊ฐ ๋์์ด ๋ค๋ฅด๊ธด ํ์ง๋ง use base;๋ ์)
package Me;
use parent 'Father';
1;
- ๋ถ๋ชจํด๋์ค์ ์ ๊ทผํ๊ธฐ ์ํ ๋ฉ์๋
- SUPER
sub new {
my ($class) = @_;
my $self = $class->SUPER::new(); # ๋ถ๋ชจํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถ
return $self;
}
- Mixin๊ฐ์ ๊ฑธ ํ๊ณ ์ถ์๋ ์ฌ์ฉ
- ๋จ์ฉํ๋ฉด ์คํ๋ ค ์์ข์
package Me;
use parent qw/Father Mother/; # ํ์์์ ์ข->์ฐ
1;
- ๋ฉ์๋ ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ
- Class::C3
- Next
-
๊ฐ์ฒด๋ฅผ ์์ ๋ง๋ ๋ค.
- package ์ ๋ฉ์๋๋ฅผ ์ ์
- bless๋ก ๋ฐ์ดํฐ์ ๊ฒฐํฉ
- ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ํด๋์ค์์ฑ์๋ ์ง์ ๋ง๋ ๋ค.
- Dan kogai said "That's why you should learn perl if you want to learn OO! You can learn how to make an object system, not just how to use it."
-
๊ฐ์ฒด์งํฅ์ ํ์ํ ๊ธฐ๋ฅ์ ๋ชจ๋ ๊ฐ์ถ์ด์ ธ ์๋ค.
-
์ถ๊ฐ ์ฐธ๊ณ
- Java์ Object ๊ฐ์๊ฒ
- UNIVERSAL์ ์ ์๋ ๊ฒ์ ์ด๋ค ๊ฐ์ฒด์์๋ ํธ์ถํ ์ ์๋ค.
- isa()
my $dog = Dog->new();
$dog->isa('Dog'); # true
$dog->isa('Animal'); # true
$dog->isa('Man'); # false
- can()
my $bark = $dog->can('bark');
$man->$bark();
-
ํธ์ถํ ๋ฉ์๋๊ฐ My::Class์ ์๋ ๊ฒฝ์ฐ
- My::Class::AUTOLOAD๋ฉ์๋ ๊ฒ์
- ๋ถ๋ชจํด๋์ค์ AUTOLOAD๋ฉ์๋ ๊ฒ์
- UNIVERSAL::AUTOLOAD ๊ฒ์
- ๋ชป์ฐพ์ผ๋ฉด ์ค๋ฅ
-
AUTOLOAD๋ ์ ์ ๋์ง์์ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ํธ์ถ๋จ
-
Ruby ์ method_missing
- ํ๋๋ฅผ ๋์ ์ผ๋ก ์ ์ํ ์ ์๊ณ
- ์์ธกํ๊ธฐ ํ๋ ํ๋์ ๋ง๋ค ์ ์์ผ๋ฏ๋ก ๋๋๋ก ์ฌ์ฉํ์ง ์๋๋ค.
- ์ด๋ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ ๊ฑด ์ดํดํด ๋์
package Foo;
sub new { bless {}, shift }
our $AUTOLOAD;
sub AUTOLOAD {
my $method = $AUTOLOAD;
return if $method =~ /DESTROY$/;
$method =~ s/.*:://;
{
no strict 'refs';
*{$AUTOLOAD} = sub {
my $self = shift;
sprintf "%s method was called!", $method;
};
}
goto &$AUTOLOAD;
}
1;
- ์์ธกํ๊ธฐ ํ๋ ํ๋์ ๋ง๋ค ์ ์์ผ๋ฏ๋ก ๋๋๋ก ์ฌ์ฉํ์ง ์๋๋ค.
- ์ด๋ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ ๊ฑด ์ดํดํด ๋์
- URI
my $uri = URI->new('http://exapmle.com/');
... do something ...
print "URI is $uri";
- DateTime
$new_dt = $dt + $duration_obj;
$new_dt = $dt - $duration_obj;
$duration_obj = $dt - $new_dt;
for my $dt (sort @dts) { # sort๋ด์์ ์ฌ์ฉ๋๋ <=> ์ฐ์ฐ์๊ฐ ์ค๋ฒ๋ก๋ ๋์ด์์
...
}
-
Perl์ ๊ฐ์ฒด์งํฅ์ ์๋์ผ๋ก ๋ง๋๋ ๋๋์ด ๊ฐํ๋ค.
- new๋ ์ค์ค๋ก ๋ง๋ ๋ค.
- ํ๋ ์ ๊ทผ์๋ ์ค์ค๋ก ์ ์
-
๋ฒ๊ฑฐ๋กญ๊ธฐ ๋๋ฌธ์ ์๋ํ์์ผ์ฃผ๋ ๋ชจ๋๋ค์ด ์กด์ฌํ๋ค.
- ์์ฑ์/์ ๊ทผ์๋ฅผ ์๋์ผ๋ก ์ ์ํด์ฃผ๋ ๋ชจ๋
- ์์ฆ์ Moose, Moo, Mouse๋ผ๋ ๋ชจ๋๋๋ฌธ์ ์ ์ฐ์ง ์์ผ๋, ๊ฐ๋จํ ์ฉ๋๋ก ๋ง์ด ์ฐ์์.
package Foo;
sub new {
bless {
foo => undef,
bar => undef,
baz => undef,
}, shift
}
sub foo {
my $self = shift;
$self->{foo} = $_[0] if defined $_[0];
$self->{foo};
}
sub bar {
my $self = shift;
$self->{bar} = $_[0] if defined $_[0];
$self->{bar};
}
sub baz{
my $self = shift;
$self->{baz} = $_[0] if defined $_[0];
$self->{baz};
}
1;
์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ค์ผ ์ ์๋ค.
package Foo;
use parent qw/Class::Accessor::Fast/;
__PACKAGE__->mk_accessors(qw/foo bar baz/); # Ruby์ attr_accessor์ ๋น์ท?
1;
- ์์๊ฐ๋ฅํ ํด๋์ค ๋ณ์๋ฅผ ๋ง๋ค๋
use parent qw/Class::Data::Inheritable/;
__PACKAGE__->mk_classdata(dsn => 'dbi:mysql:dbname=foo');
1;
package UsualClass;
use parent qw/Class::Accessor::Fast Class::Data::Inheritable/;
__PACKAGE__->mk_classdata(hoge => "classdata");
__PACKAGE__->mk_accessors(qw(foo bar baz));
# ๋ฉ์๋ ๋ฑ ์ ์
1;
-
ํ๋์ ์ธ ๊ฐ์ฒด์งํฅ์ ์คํํ๋ ๋ชจ๋
-
์ ์ฐํ๊ณ ์์ ํ ์ ๊ทผ์๋ฅผ ์์ฑ
-
ํ์ ์์คํ ๋์
-
Role์ ์ํ ์ธํฐํ์ด์ค์งํฅ ์ค๊ณ
-
์๊ท๋ชจ์ ์ฐ๊ธฐ์ ๋ค์ ๋ฉ์น๊ฐ ํฌ๊ณ ๋ณต์กํ๋ค.
- Moose์ ๊ฒฝ๋๋ฒ์ ผ
- Moose์ ์ด๊ธฐ๋ก๋ฉ ์๊ฐ์ ์ข ๊ฑธ๋ฆฌ๋๊ฒ์ ๋นํด ๊ฐ๋ฒผ์
- Moose์ ๋นํด ๊ธฐ๋ฅ์ ์ผ๋ถ ์ ํ์
- Moose์ ๊ฒฝ๋๋ฒ์ ผ
- ๊ฐ๋ฒผ์ด Moose๋ฅผ ์ํ ๊ฒฝ์ฐ ์์ฆ Moose๋์ ์ ๋ง์ด ์ด๋ค.
- Mouse๋งํผ ๊ฐ๋ณ๋ค.
- Moose์ ๊ฐ์ด ์ฌ์ฉ์ ํ์์ Moose๊ฐ์ฒด๋ก ์๋ ์ ๊ทธ๋ ์ด๋ ํด์ค.
- ๋ฑ์ฅ์ธ๋ฌผ์ ์๊ฐ = ๊ฐ์ฒด
- ๋ฑ์ฅ์ธ๋ฌผ์ด ๊ฐ๊ฐ ์ด๋ ํ ์ฑ ์(responsibility)์ ์ํํด์ผ ํ๋์ง ์๊ฐํ๋ค.
- ์ฑ
์์ ๋ง์ถ์ด ๋ฒ์๋ฅผ ์ ํํ๋๋ก ํ๊ธฐ
- "์บก์ํ์์ ์์์์ ๋คํ์ฑ์ด...."๋ฑ๋ฑ ๋๋ฌด ๋ณต์กํ๊ฒ ์๊ฐํ ํ์๋ ์๋ค.
- ๋ณด๋ค ์ข์, ์ฝ๊ฒ ๋ฌธ์ ๋ฅผ ๋ชจ๋ธ๋ง ํ๊ธฐ ์ํ ์๋จ
- ๊ฐ์ฒด์ ์ด์ฉ์, ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ณณ๊ณผ์ ์ฝ์
- ์ฑ ์์ด ์๋ ๊ฒ์ ํ์ง ์์๋ ๋๋ค
- ์ฑ ์์ด ์๋ ๊ฒ์ ํด์๋ ์๋๋ค
- ์ฑ ์์ ๊น๋ํ๊ฒ ๋๋๋ ๊ฒ์ผ๋ก ๊น๋ํ๊ฒ ์ค๊ณํ ์ ์๋ค.
- ์ง์ ๋ง๋ ๋๋์ด ๋ฌผ์ฌ ๋๋ ๊ฐ์ฒด์งํฅ
- package ์ ๋ฉ์๋๋ฅผ ์ ์
- bless ๋ก ๋ฐ์ดํฐ(๋ ํผ๋ฐ์ค)๋ฅผ ๋ฌถ๋๋ค
- ์์ฑ์๋ ์ค์ค๋ก ๋ง๋ ๋ค
- ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ํธ์ถํ๊ธฐ ์ฉ์ดํ๋๋ก ํฌ์ฅ
- ํ๋ก๊ทธ๋จ์ ๋ณ๊ฒฝํ๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ [๋ ๊ฑฐ์ ์ฝ๋ ๊ฐ์ ๊ฐ์ด๋๋ก๋ถํฐ]
- ๊ณ ์น๊ณ ๊ธฐ๋ํ๋ค
- ํ ์คํธ์ฝ๋๋ฅผ ์จ์ ๋ณดํธํ๊ณ ๋ณ๊ฒฝํ๋ค
-
ํ ์คํธ๊ฐ ์์ผ๋ฉด ํ๋ก๊ทธ๋จ์ด ์ ๋๋ก ์์ง์ธ๋ค๋ ๊ฒ์ ์ฆ๋ช ํ ์ ์๋ค
-
๋๊ท๋ชจ ํ๋ก์ ํธ์์๋ ์น๋ช ์
- ์๋ ์ ์ด ์ฝ๋๋ ์ง๊ธ๋ ์์ง์ด๊ณ ์๋๊ฐ?
- ์๋ก์ด ์ฝ๋์ ์ ์ฝ๋์ ์ ํฉ์ฑ์ ๊ฐ์ง๊ณ ์๋๊ฐ?
- ์ ๋๋ก๋ ์ฌ์/์๋๊ฐ ๋ฌด์์ด์๋์ง ๊ธฐ์ตํ๊ณ ์๋๊ฐ?
-
Perl ์ฒ๋ผ ํ์ ์ด ์๋ ๋์ ์ธ ์ธ์ด์์๋ ํนํ ์ค์
-
๊ธฐ๋ํ์ง ๋ง๊ณ ํ ์คํธ์ฝ๋๋ฅผ ์ฐ์
-
์ ์์ ์ธ ์ฒ๋ฆฌ
-
๋น์ ์์ ์ธ ์ฒ๋ฆฌ
-
๊ทธ ๊ฒฝ๊ณ
-
100% ์ปค๋ฒํ๋ ๊ฒ์ ์ด๋ ต๋ค
- ๋ช ๋ น๋ฌธ ๋ง๋ผ(C0)/๋ถ๊ธฐ๋ง๋ผ(C1)/์กฐ๊ฑด๋ง๋ผ(C2)
- C2 ๋ ์ ๋ง ํฐ์ผ
-
ํ์/์ํํ๋ค๊ณ ์๊ฐ๋๋ ๊ณณ๋ถํฐ ์ฐ๊ณ ์กฐ๊ธ์ฉ ๋ณด์ํด๋๊ฐ๋ค.
- Test::More
- Test::Fatal
- Test::Class
use Test::More;
subtest 'topic' => sub {
use_ok 'Foo::Bar';
isa_ok Foo::Bar->new, 'Foo::Bar';
ok $something_to_be_bool;
is $something_to_be_count, 5;
is_deeply $something_to_be_complicated, {
foo => 'foo',
bar => [qw(bar baz)],
};
};
done_testing;
use Test::Fatal;
ok( exception{ $foo->method }, '์์ธ๋ฅผ ๋์ง๋ค');
like( exception { $foo->method }, qr/division by zero/, '0 ๋๋์
์๋ฌ๊ฐ ๋ฐ์ํ๋ค');
isa_ok( exception { $foo->method }, 'Some::Exception::Class', '์์ธ ํด๋์ค๊ฐ ๋์ ธ์ง๋ค');
-
๋ฉ์๋๋ก ํ ์คํธ์ฝ๋๋ฅผ ๋๋๋ค
-
xUnit๊ณ์ด
-
Sorter ์ ํ ์คํธ ์ฝ๋๋ฅผ ๋ด!
- ์ด๋ฆ์ด ๋ถ์ง ์์ ํ ์คํธ๋ฅผ ๋ณด๊ธฐ ์ข๊ฒ ํ์ํด์ค๋ค
- ํธ๋ฆฌํ ํ ์คํธ ๋ชจ๋์ ํ๊บผ๋ฒ์ use ํด์ค๋ค
- ํ
์คํธ ์ฝ๋๋
t
๋๋ ํ ๋ฆฌ์.t
ํ์ฅ์๋ฅผ ๋ถ์ฌ์ ์ ์ฅํ๋ค- t/hoge.t
- prove ์ปค๋งจ๋(Test::More์ ์ฒจ๋ถ)๋ก ์คํํ๋ค
$ prove -lvr t
t/hoge.t ..
ok 1 - L8: is Hoge::hey(10), 100;
1..1
ok
All tests successful.
Files=1, Tests=1, 0 wallclock secs ( 0.02 usr 0.01 sys + 0.03 cusr 0.01 csys = 0.07 CPU)
Result: PASS
- ์ฐ์ , ์ด๋ค ๋ฐฉ์์ผ๋ก ํ๋ํด์ผ ๋๋ค๋ผ๋ ๊ฒ์ ํ ์คํธ๋ก ์ด๋ค
is_deeply( [numsort(2,3,4,0,1)], [0,1,2,3,4], '๋๋คํ ์์ด์ sort ํ๋ฉด ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋๋ค' );
- ๋ค์์ผ๋ก ๊ฒฝ๊ณ์กฐ๊ฑด์ผ๋ก ํ๋์ ๊ฒ์ฆํ๋ ํ ์คํธ๋ฅผ ์ด๋ค
is_deeply( [numsort()], [], '๋น ๋ฐฐ์ด์ sort ํ๋ฉด ๋น๊ฐ์ด ๋๋ค' );
is_deeply( [numsort(100)], [100], 'ํ ์์ ๋ฟ์ด๋ผ๋ฉด ๊ทธ๋๋ก' );
- ์์ธ ์กฐ๊ฑด์ ๋ํด์๋ ํ์ธํ๋ค
ok( exception { [numsort('hoge')] },'๋ฌธ์๋ฅผ ๋๊ธฐ๋ฉด ์์ธ๋ฐ์' );
- ํํ ๋ ์ฌ๋ด์์ ํ์คํ ์ค์ธ ํ ์คํธ ํ๋ ์์ํฌ
- Test::More/Test::Exception ๋ฑ์ ํธ๋ฆฌํ ํจ์
- ์ ๋ํ ์คํธ/๊ฒฐํฉํ ์คํธ/๋ถ์์ฉ์ด ์๋ ํ ์คํธ์ ๋ํด์ ์ง์
-
๋ฆฌํฉํ ๋ง์ด๋?
- ํ๋ก๊ทธ๋จ์ ํ๋์ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ตฌํ์ ๋ณ๊ฒฝํ๋ ๊ฒ
-
ํ ์คํธ๊ฐ ์์ผ๋ฉด ์ธ๋ถ๊ธฐ๋ฅ์ ๋ณ๊ฒฝ์ด ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํ ์ ์๋ค
- ํ ์คํธ๊ฐ ์์ผ๋ฉด ๋ฆฌํฉํ ๋ง์ด ์๋๋ค
-
๋ ๊ฑฐ์ํ ์ฝ๋์ ๋ํด์๋ ์ด๋ป๊ฒ ํ๋๊ฐ?
- ์ฐ์ ์ ํ ์คํธ ์ฝ๋๋ฅผ ์ธ ์ ์๋ ์ํ๋ก ๋ง๋ ๋ค.
-
ํ ์คํธ ์ฝ๋๋ฅผ ์จ์ ๋ฆฌํฉํ ๋งํด์ ํญ์ ๊น๋ํ๊ฒ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์ฐ์
- perldoc perltoc ์ด ํธ๋ฆฌ๏ผ
- ๋ฏธ๋ฆฌ ์ ์๋ ๋ณ์ใ$_ @_ $@
- perldoc perlvars ๋ฅผ ๋ณธ๋ค
- ๋ฏธ๋ฆฌ ์ ์๋ ๋ณ์ใ$_ @_ $@
- ํจ์
- perldoc -f open
- http://perldoc.perl.org/ : perldoc ๋ฌธ์
- CPAN ๋ชจ๋
- Programming Perl
- Beginning Perl
- Perl Best Practice
- Perl::Critic
- ๋ชจ๋ Perl ์ ๋ฌธ
- ์ฝ๋๋ ๋๊ตฐ๊ฐ๊ฐ ์ฝ์ ์ ์์ด์ผ ํ๋ค๋ ๊ฒ์ ์์ํ๋ค
- ๋์ค์ ๋๊ตฐ๊ฐ ์ฝ์ด๋ ์๊ธฐ ์ฝ๊ฒ ์ด๋ค
- ์๋ฌต์ ์ธ ๋ฃฐ์ ์๋ค => ์ฝ๋๋ฅผ ์ฝ๊ฒ ์ดํดํ๋ค
- ํ ์คํธ๋ฅผ ์จ์ ์๋๋ฅผ ์ ๋ฌํ๋ค
-
Perl ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ด
-
Perl ์ ์ํ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
-
ํ ์คํธ์ฝ๋๋ฅผ ์ฐ์
-
ํํธ
-
์ค๋ ์จ์ ์ค๋ ํค๋งค์
- ๋ผ๊ณ ๋งํด๋ ์๊ฐ์ด ๊ทธ๋ค์ง ์๊ธฐ๋๋ฌธ์ ๋ฌด๋ฆฌ๋ ํ์ง ๋ง๊ณ
์ด ๊ฐ์๋ฅผ ๋ง์น๊ณ , ์ฌ์ ๊ณผ์ ๋ก ์์ฑํ Sorter ํด๋์ค๋ฅผ ๊ฐ๋/์์ฑํด์ฃผ์ธ์.
์๋์ฒ๋ผ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ , ์ ์๊ฐ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ ์ ๋ ฌํด๋์ค๋ฅผ Perl ์ ์ฌ์ฉํด์ ๊ตฌํํด์ฃผ์ธ์. ์ฌ์ ๊ฐ ์๋ ์ฌ๋์ ์๊ณ ๋ฆฌ์ฆ ๋ณ๋ก Sorter ์๋ธ ํด๋์ค๋ฅผ ๊ตฌํํด์ฃผ์ธ์.
my $sorter = Sorter->new;
$sorter->set_values(5,4,3,2,1);
$sorter->sort;
$sorter->get_values # (1,2,3,4,5) ์ด ๋ฐํ๋๋ค
๊ตฌํ์ ๋ํด์๋ ์๋์ ์กฐ๊ฑด์ ์ง์ผ์ฃผ์ธ์.
- Perl ๋ด์ฅ sort ํจ์๋ ์ ๋ ฌ์ ํ๋ CPAN ๋ชจ๋์ ์ด์ฉํ์ง ์๋๋ค
- ์๊ณ ๋ฆฌ์ฆ์ ํต์ํธ๋ฅผ ์ฌ์ฉํ๋ค
๊ฐ์ฒด์งํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ My::List ๋ฅผ ์์ฑํด์ฃผ์ธ์.(C์ธ์ด์์ ์์ฃผ ์ฌ์ฉ๋๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ฒด์งํฅ Perl ๋ก ๋ง๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํด์ฃผ์ธ์)
๋ฆฌ์คํธ์ ๊ฐ ์์์๋ ์์์ ๋ฐ์ดํฐ(์ค์นผ๋ผ, ๊ฐ์ฒด, ๋ ํผ๋ฐ์ค ๋ฑ) ์ ์ ์ฅํ ์ ์๋ ๊ฒ์ผ๋ก ํฉ๋๋ค. ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๊ฐ์ฒด์งํฅ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๋๋ค. ๋ฆฌ์คํธ์ ์์๋ฅผ ๋จผ์ ๋๋ฌ์ด๊ฐ๋ฉด์ Iterator ๋ฅผ ์ค๋นํด์ฃผ์ธ์.
My::List ์ ํ๋ก๊ทธ๋จ ์ธํฐํ์ด์ค๋ ์๋์ฒ๋ผ ๋ ๊ฒ๋๋ค. ์๋์ ์์ ๋ ๋ฆฌ์คํธ์ "Hello" "World" "2008" ๋ผ๋ ์ธ๊ฐ์ง ๋ฌธ์์ด์ ์ ์ฅํ๊ณ , Iterator ๋ก ๊ทธ๊ฒ๋ค์ ๋ฝ์์ ์ถ๋ ฅํ๋ ์ฝ๋์ ๋๋ค.
my $list = My::List->new;
$list->append("Hello");
$list->append("World");
$list->append(2008);
my $iter = $list->iterator;
while ($iter->has_next) {
print $iter->next->value;
}
๋ฆฌ์คํธ์ ๊ฐ ์์๋ My::List ์์ ๋ฐฐ์ด๋ก ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ, ํด์ฌ๊ธฐ๋ฐ์ ๋ฆฌ์คํธ ์์์ ๊ฐ์ฒด๋ฅผ ๋ฆฌํผ๋ฐ์ค๋ก ์ฐ๊ฒฐํ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ฐ์ง๋ค๋ ์ ์ ์ฃผ์ํด์ฃผ์ธ์.
-
์ฐ๊ฒฐ๋ฆฌ์คํธ๊ฐ ์ด๋ค ๋ฐ์ดํฐ ๊ตฌ์กฐ์ธ์ง ์ ์ ์๋ ๊ฒฝ์ฐ๋ ใๅฎๆฌ Cํ๋ก๊ทธ๋๋จธ๋ฅผ ์ํ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฐ์ดํฐ ๊ตฌ์กฐ(SOFTBANK BOOKS)ใ P.50 - 66 ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์. (๊ทธ๋ฆฌ๊ณ , ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋ฑ์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๊ธฐ์ด์ด๊ธฐ์, ๊ด๋ จ์ง์์ด ์๋ ๊ฒฝ์ฐ๋ ์ด ์ฑ ์ ํต๋ ํ๊ธฐ๋ฅผ ๊ถํฉ๋๋ค.)
-
Iterator ์ ๋ํด์๋ ใ์ฆ๋ณด๊ฐ์ ํ Java์ธ์ด๋ก ๋ฐฐ์ฐ๋ ๋์์ธํจํด ์ ๋ฌธใ์ ์ฒซ๋ฒ์งธ์ฅ์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
์ ๋ ์์ ๋ชจ๋ ํ์ฌ์ ์ฑ ์ฅ์ ์์ต๋๋ค.
twitter์ ๋น์ทํ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ณด์.
๋ค์ ๋ด์ฉ์ ์ฒ๋ฆฌํ ์ ์๋ ์งน์งน์ด ๊ฐ์ฒด๋ฅผ ๊ตฌํํด์ฃผ์ธ์.
- ์งน์งน์ด๋ ํธ์ํ ์ ์๋ค
- ์งน์งน์ด๋ ๋ค๋ฅธ ์งน์งน์ด๋ฅผ follow ํ ์ ์๋ค
- ์งน์งน์ด๋ follow ํ๊ณ ์๋ ์งน์งน์ด์ ํธ์์ ๋ณผ ์ ์๋ค
์ฌ๋ฌ๊ฐ์ง ์ค๊ณ๋ฐฉ๋ฒ์ด ์๊ฒ ์ต๋๋ค๋ง, ๊น๋ํ๊ณ ๋ฉ๋ค์ด์ง ๊ฒ์ ์๊ฐํด๋ด ์๋ค. ์ฌ์ ๊ฐ ์๋ค๋ฉด, mentions(@๊ธฐ๋ฒ)์ด๋ unfollow ๋ block, lists ๋ฑ์ ๊ธฐ๋ฅ๋ ๊ตฌํํด์ฃผ์ธ์.
ํ๋ก๊ทธ๋จ์ ์ธํฐํ์ด์ค๋ ์์ ์ ๋๋ค. ์๋ฅผ๋ค์ด ์๋์ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์๊ฐํ ์ ์์ต๋๋ค. ์๋์ ์์ ์์๋ SmallBird ํด๋์ค๋ฐ์ ์์ง๋ง, ํธ์์ด๋ ์ ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ ํด๋์ค๊ฐ ์์ด๋ ์ข๊ฒ ๋ค์. Observer ํจํด์ ์ฌ์ฉํด๋ ๋ฉ๋๋ค.
use Bird;
my $b1 = Bird->new( name => 'jkondo');
my $b2 = Bird->new( name => 'reikon');
my $b3 = Bird->new( name => 'onishi');
$b1->follow($b2);
$b1->follow($b3);
$b3->follow($b1);
$b1->tweet('์ค๋์ ๋ฅ๋ค์๏ผ');
$b2->tweet('์ปคํผ๋ง์๋ฌ ๋์์ต๋๋ค');
$b3->tweet('์ง๊ธ ์ฌ์๋๏ผ');
my $b1_timelines = $b1->friends_timeline;
print $b1_timelines->[0]->message; # onishi: ์ง๊ธ ์ฌ์๋!
print $b1_timelines->[1]->message; # reikon: ์ปคํผ๋ง์๋ฌ ๋์์ต๋๋ค
my $b3_timelines = $b3->friends_timeline;
print $b3_timelines->[0]->message; # jkondo: ์ค๋์ ๋ฅ๋ค์!
- ๊ฐ๋ฅํํ ํ
์คํธ์คํฌ๋ฆฝํธ๋ฅผ ์ด๋ค
- ์ ์ด๋ ๋๋ ค์ ์ํํด๋ณผ ์ ์๋ค๋ฉด ์ฑ์ ํ ์ ์์ต๋๋ค.
- ๊ณผ์ ์ ๋ณธ์ง์ ์ธ ๋ถ๋ถ๋ง ๊ตฌํํ๋ฉด CPAN ๋ชจ๋๋ก ์ฝ๊ฒ ํด๋ ๋ฉ๋๋ค.
- ๋ฌด์์ด ๋ณธ์ง์ ์ธ๊ฐ๋ฅผ ํ์ธํ๋ ๊ฒ๋ ๊ณผ์ ์ค ํ๋
- ์ฌ์ ๊ฐ ์๋ค๋ฉด ๊ธฐ๋ฅ ์ถ๊ฐํด๋ณด์ธ์.
- ๊ณผ์ ์ ๋ํด์๋ ์๋์ฒ๋ผ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํด์ ์ปค๋ฐํด์ฃผ์ธ์.
- push ํ๋ ๊ฒ์ ์์ง ๋ง๊ณ !
intern/username/100802/exercise1
/exercise2
/exercise3
/100803/exercise1
/exercise2
/ ...
/ ...
Perl์ ์ต๊ด์ผ๋ก์จ, ์๋์ ๊ฐ์ ๋๋ ํ ๋ฆฌ ๊ตฌ์ฑ์ผ๋ก ์ปค๋ฐํ๋ฉด ์ฌ๋ฌ๋ชจ๋ก ์ข์ต๋๋ค.
.
|-- lib
| `-- MyClass
| `-- Foo.pm
`-- t
`-- 00_base.t
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋๋ ๋๋ ํ ๋ฆฌ๋ lib
- ํ ์คํธ ํ์ผ์ ๋๋ ๋๋ ํ ๋ฆฌ๋ t
- ํ ์คํธ ์คํฌ๋ฆฝํธ๋ prove -Ilib t ๋ก ์คํํฉ๋๋ค
- ๋๋ ํ ์คํธ ์คํฌ๋ฆฝํธ ํ๋๋ฅผ perl -Ilib t/00_base.t ๋ก ์คํํฉ๋๋ค.
๊ฐ ๊ณผ์ ์ ๋ง์ = ๊ณผ์ 1: 4์ + ๊ณผ์ 2: 4์ + ๊ณผ์ 3: 2์ = 10์
-
๊ฐ์ ๋๋ ๊ต๊ณผ์์ ์ดํด๋๊ฐ ๊ณผ์ ์ ๊ตฌํ์ ๋ฐ์๋์๋๊ฐ
-
ํ ์คํธ์ฉ ์คํฌ๋ฆฝํธ๊ฐ ์ค์ ๋ก ๋์ํ๋ ๊ฐ
-
์ค๊ณ/์ฝ๋๊ฐ ์ ๋๋ก ๋์ด ์๋๊ฐ
-
๋ ์์ ์ผ๋ก ๊ธฐ๋ฅ์ถ๊ฐ๊ฐ ๋์ด์๋๊ฐ
-
๊ณผ์ 1๊ณผ ๊ณผ์ 2๋ฅผ ์ ๋๋ก ํ ๋ค์์ ๊ณผ์ 3์ ๋์ ํด์ฃผ์ธ์.
- ์ค์ค๋ก ํ์ด๋ณด๋ ค๊ณ ๋ ธ๋ ฅํด๋ณด์ธ์~
- https://github.com/limitusus/Hatena-Textbook ์ ํด๋ต ์์๊ฐ ์์ต๋๋ค.
- git clone
- ๊ณผ์
์ด ์ํ์ ํฌ๋ฆฌ์์ดํฐ๋ธ ์ปค๋จผ์ฆ ํ์ - ๋น์๋ฆฌ - ์์ 2.1 ์ผ๋ณธ ๋ผ์ด์ผ์ค์ ์๋์์ ์ ๊ณต๋ฉ๋๋ค.