-
Notifications
You must be signed in to change notification settings - Fork 15
Learning perl 5th review
์ด ๋ฌธ์๋ Learning Perl 5th( http://oreilly.com/catalog/9780596520113 )์ ํ๊ธ ๋ฒ์ญํ์ธ "๊ฑฐ์นจ์์ด ๋ฐฐ์ฐ๋ ํ"( http://www.yes24.com/24/goods/4433208 )์ ๋ณด์ถฉํ๊ณ ์ดํด๋ฅผ ๋์ฐ๋ฉฐ ์ฝ๊ฐ์ ์ต๊ทผ์ ๊ฒฝํฅ๊ณผ ๋ง์ง ์๋ ๋ถ๋ถ์ ๋ํ ๊ฐ์ด๋๋ฅผ ์ํ ๋ชฉ์ ์ผ๋ก ๋ง๋ค์์ต๋๋ค. (๋ฒ์ญํ์ ์์๋ฅผ ์ถฉ์คํ๊ฒ ๋ฒ์ญํ์์ ๋ฟ์ด๋ฏ๋ก ์ฌ๊ธฐ์ ๋งํ๋ ๊ฑด ๋ฒ์ญ์์ ๋ฌธ์ ๊ฐ ์๋๋ผ ์๋ฌธ๋ด์ฉ์ ๋ํ ๋นํ์ธ ์ ์ด ๋จ)
๋ฌธ์์ด ๋ด์ \n ๊ฐ์ ํน์ํ ์๋ฏธ๋ฅผ ์ง๋๋ ์ญ์ฌ๋์ ํํผ ๋ฌธ์๋ ๋ณ์๊ฐ์ ๋ณด๊ฐ(Interpolation)๋์ด์ผ ํ๋ ๊ฒ์ด ์์ผ๋ฉด " "๋์ ์ ' '์ ์ฐ๋๊ฒ ์ข์ต๋๋ค. ๊ทธ๋ ๊ฒ ๋ฒ๋ฆ์ ๋ค์ฌ ๋์ผ๋ฉด ๋ฌธ์์ด์ ๋ฌถ๋ ", ' ๋ง ๋ณด๊ณ ๋ ์ด ๋ฌธ์์ด ๋ด์๋ ๋ณด๊ฐ๋์ด์ผํ ๋ณ์๋ ํํผ๋ฌธ์๊ฐ ์๋์ง ์๋์ง ๋ฐ๋ก ์ ์ ์๊ฒ ๋ฉ๋๋ค.
undef๋ ๊ฐ์ด๊ธฐ๋ ํ์ง๋ง ์ด๋ค ๋ณ์๋ฅผ ์ด๊ธฐํํ๋ ํจ์์ด๊ธฐ๋ ํฉ๋๋ค. ์ค์ ๋ก undef๋ Perl์ ์ ์๋ ํจ์( ์ฐธ๊ณ :http://perldoc.perl.org/functions/undef.html )์ ๋๋ค. p48์ ๋ณด๋ฉด $madonna = undef; ๋ก ์ค์นผ๋ผ๊ฐ์ ์ ์๋์ง ์์ ๊ฐ์ผ๋ก ์ด๊ธฐํ ํ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ undef๋ผ๋ ํจ์๋ฅผ ์๋ฌด๋ฐ ์ธ์ ์์ด ํธ์ถํ์๋ ์ ์๋์ง ์์ ๊ฐ์ ๋ฆฌํดํด์ฃผ๋ฏ๋ก ๊ทธ๊ฒ์ $madonna์ ๋ฃ์ด ๋ณ์๋ฅผ ์ ์๋์ง ์์ ๊ฐ์ผ๋ก ์ด๊ธฐํ ์์ผ์ฃผ๋ ๊ฒ๋๋ค. undef์ ํจ์์ ์๋ ์์ ๋งํฌ์์๋ ๋ณด๋ค์ํผ undef EXPR์ ๋๋ค. EXPR์ ํํ์์ ๋ํ๋ด๋ฉฐ EXPR ๋ถ๋ถ์๋ ๋์ค์ ๋ฐฐ์ธ ๋ฐฐ์ด์ด๋ ํด์๊ฐ ์์ ์ค์นผ๋ผ๋ฟ๋ง ์๋๋ผ ๋ฐฐ์ด์ด๋ ํด์๋ฑ์ ์ด๊ธฐํ์๋ ์ฌ์ฉํฉ๋๋ค.
undef $scalar; # ์ค์นผ๋ผ ์ด๊ธฐํ
undef @array; # ๋ฐฐ์ด ์ด๊ธฐํ, @array = () ๋ก๋ ๊ฐ๋ฅ
undef %hash; # ํด์ ์ด๊ธฐํ, %hash = () ๋ก๋ ๊ฐ๋ฅ
์ ๊ฐ $madonna = undef; ๋ฅผ ์์ข๊ฒ ๋ณด๋ ์ด์ ๋ ์ ๋ฐ ํํ๋ฅผ ๋ณด๊ณ ๋ฐฐ์ด์ด๋ ํด์๋ฅผ ์ด๊ธฐํ ํ ๋๋
@array = undef;
%hash = undef;
๊ฐ์ ๋ง๋ ์๋๋ ์ค์๋ฅผ ํ๊ธฐ ๋๋ฌธ์ด์ฃ . ์ ๋ ๊ฒ ํ๋ฉด ์๋์๋ ๋ฌ๋ฆฌ @array๋ undef๊ฐ์ด ํ๋ ๋ค์ด๊ฐ ๋ฐฐ์ด (undef)๊ฐ ๋๋ฉฐ %hash๋ ( "" => undef ) ๊ฐ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ค์นผ๋ผ,๋ฐฐ์ด,ํด์๋ฑ์ ๋ณ์๋ฅผ ์ด๊ธฐํํ ๋๋ undef ๋ณ์; ํํ๋ก ํ์๋๊ฒ ์ข์ต๋๋ค.
##3์ฅ ๋ชฉ๋ก๊ณผ ๋ฐฐ์ด
"๋ชฉ๋ก ์์๋ ์ผํ๋ก ๊ตฌ๋ถํ ๊ฐ์ ๋ชฉ๋ก์ ๊ดํธ๋ก ๋๋ฌ์ผ ๊ฒ์
๋๋ค." ๋ผ๊ณ ๋์ด์์ง๋ง ๊ดํธ๋ฅผ ๋๋ฌ์ธ๋ ๊ฒ์ ์ฌ์ค ํ์๊ฐ ์๋๋๋ค. ์ผ๋ก๋ก
@a = (1..100);
๋ @a = 1..100;
์ผ๋ก ๊ดํธ๋ฅผ ๋๋ฌ์ธ์ง ์์๋ ๋ฉ๋๋ค. ์ด์ ๋ ์ฐ์ฐ์ ์ฐ์ ์์์ ์ํด์ ..๊ฐ =๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๊ธฐ ๋๋ฌธ์ 1..100์ ์ํด ๋จผ์ ๋ชฉ๋ก(list)๊ฐ ์์ฑ๋ ๋ค์ ๋ฐฐ์ด๋ณ์ @a์ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ด์ฃ . ํ์ง๋ง @a = (1,2,3);
์ ,๊ฐ =๋ณด๋ค ์ฐ์ฐ์ ์ฐ์ ์์๊ฐ ๋ฎ๊ธฐ ๋๋ฌธ์ ๊ผญ ๊ดํธ๋ฅผ ๋๋ฌ์ธ์ผ ํฉ๋๋ค. ๊ทธ๋ฌ์ง ์๊ณ @a = 1,2,3;
์ด๋ผ๊ณ ํ๋ฉด @a๋ฐฐ์ด์๋ 1 ํ๋๋ง ๋ค์ด๊ฐ๊ณ ๋๋จธ์ง๋ void context๋ผ๋๊ฑธ๋ก ๊ทธ๋ฅ ๋ฌด์๋ฉ๋๋ค. ๋ฐ๋ผ์ "์ผํ๋ก ๊ตฌ๋ถํ ๊ฐ์ ๋ชฉ๋ก"์ด ๋ชฉ๋ก(list)์ด๋ฉฐ ์ฐ์ฐ์ ์ฐ์ ์์์ ๋ฌธ์ ๊ฐ ์์ ๊ฒฝ์ฐ ๊ดํธ๋ก ๊ฐ์ธ์ค๋ค๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.
๋ค๋ฅธ ์๋ก ๋ฌธ์์ด์ ์ฐ๋ print ํจ์์ ํ๋กํ ํ์ ์ print LIST ์ ๋๋ค. LIST๋ ๋ชฉ๋ก์ ๋งํ์ฃ . print๋ฌธ์ ๋ค์์ฒ๋ผ
print 'hello world', "\n";
๋ก LIST์ธ 'hello world', "\n" ๋ฅผ ๊ดํธ๋ก ์ธ์ง ์์๋ ์ค๋ฐ๊ฟ ๋ฌธ์์ด ๊น์ง ๋ค ์ ์ถ๋ ฅํฉ๋๋ค. ์ด๊ฒ์ print ํจ์๊ฐ ๋ฆฌ์คํธ๋ฅผ ๊ตฌ์ฑํ๋ ,์ฐ์ฐ์ ๋ณด๋ค ์ฐ์ ์์๊ฐ ๋ฎ๊ธฐ ๋๋ฌธ์ ๊ตณ์ด LIST๋ฅผ ๊ดํธ๋ก ๋ฌถ์ง ์์๋ printํจ์์ ๋์ด๊ฐ LIST๊ฐ ๋จผ์ ๊ตฌ์ฑ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ด
print (1+2),4;
๋ผ๊ณ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์ฌ๊ธฐ์๋ 1+2๋ฅผ ๋ฌถ๋ ๊ดํธ๋ฅผ print๋ ์์ ์ด ์ฐ์ด์ผํ LIST๋ฅผ ๋ฌถ๋ ๊ดํธ๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ 1+2์ ๊ฒฐ๊ณผ์ธ 3๋ง ์ถ๋ ฅํ๊ณ ๋ค์ 4๋ ๋ฌด์ํด๋ฒ๋ฆฝ๋๋ค. ์ด๋ด ๋๋ LIST๋ฅผ ๋จผ์ ๊ตฌ์ฑํด์ฃผ๊ธฐ ์ํด์๋
print( (1+2),4 );
๋ผ๊ณ ํ๋ฉด 3๊ณผ4๋ฅผ ๋ค ์ถ๋ ฅํ๊ฒ ๋ฉ๋๋ค. ํจ์ ํธ์ถ์ ๊ดํธ์ ๋ํ ๊ท์น์ ๋์ค์ ๋ค์ ์ธ๊ธํ ๊ธฐํ๊ฐ ์์๊ฒ๋๋ค.
์ ๊ฐ์ธ์ ์ผ๋ก qw( some text ) ๋ผ๋ ํํ๋ณด๋ค ๊ธฐ๋ณธ์ ์ผ๋ก qw/some text/ ๋ผ๋ ํํ์ ํํ์ ์ ํธํฉ๋๋ค. ์ฑ ์๋ ์ค๋ช ์ด ๋์ค์ง๋ง qw ๊ฐ์ Quote like Operators( ์ฐธ๊ณ : http://perldoc.perl.org/perlop.html#Quote-and-Quote-like-Operators ์ http://perltraining.com.au/tips/2005-04-22.html )๋ฅผ ๋๋ฌ์ธ๋ ๊ตฌ๋ถ์๋ ๋ค์ํ๊ฒ ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค. ํ์ง๋ง ์ด์ฌ์๋ค์ด qw( some text ); ํํ๋ก ์ฐ๋ฉด ๊ดํธ๋ฅผ ๋ณด๊ณ qw๊ฐ์ ์ฐ์ฐ์๊ฐ ๋ง์น ์ธ์๋ฅผ ๋ฐ๋ ํจ์์ธ๋ฅ ์ฐฉ๊ฐํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ง์ด ๋ดค๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก qw/some text/ ํํ๋ฅผ ์ ํธํฉ๋๋ค. ๋ญ ์๊ณ ์ฐ๋ฉด ๋ฌธ์ ์๊ฒ ์ง๋ง์.
๋ฐฐ์ด์๋ ๋ฐฐ์ด์ฌ๋ผ์ด์ค ๋ฌธ๋ฒ์ด๋ผ๋ ๊ฒ์ด ์์ต๋๋ค. ๋ฐฐ์ด @a์ ๋ง์ ์์๋ค์ด ์๋ค๊ณ ํ ๋ ์ฒซ๋ฒ์งธ,๋๋ฒ์งธ,์ธ๋ฒ์งธ ์์๋ฅผ ($a[0], $a[1],$a[2])๋ผ๊ณ ํ๋ฉด ์ด๊ฒ์ @a[0,1,2] ๋ก ๋ํ๋ผ ์ ์์ต๋๋ค. ์ด๊ฒ์ [ ]์์ 0,1,2๊ฐ ์ฐ์์ ์ด๋ฏ๋ก ๋ ์ค์ฌ์ @a[0..2] ๋ก ๋ํ๋ผ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด
($betty[0], $betty[1]) = ($betty[1], $betty[0]);
์ ๊ฐ๋จํ๊ฒ
@betty[0,1] = @betty[1,0];
์ผ๋ก
($rocks[0], $rocks[1], $rocks[2], $rocks[3]) = qw/talc mica feldspar quartz/;
๋
@rocks[0..3] = qw/talc mica feldspar quartz/;
๋ก ์ค์ฌ์ธ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ค ๋ฐฐ์ด์ด๋ ๋ฆฌ์คํธ์์ ์ฒซ์์๋ ์ค์นผ๋ผ๋ณ์์ ๋ค๋ฅธ ๋๋จธ์ง๋ ์ด๋ค ๋ฐฐ์ด๋ณ์์ ๋ด์ ์ฐ๊ณ ์ถ์ผ๋ฉด ($var,@array) = @data;
์ฒ๋ผ ํ๋ฉด ๋ฉ๋๋ค.
๋ฐฐ์ด์ ๋ํด์ ๋ ๊น์ด ์๊ณ ์ถ์ผ๋ฉด http://perl101.org/arrays.html ์ http://gypark.pe.kr/wiki/Perl/%EB%B0%B0%EC%97%B4 ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
ํจ์ ํธ์ถ์ &๋ฅผ ๋ถ์ด๋๊ฑด ์์ฆ์ ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ์ ์ฐ์ด์ง ์๋ ์ค๋๋ ๊ดํ์ ๋๋ค. ์ฑ ์์๋ ํน์๋ Perl์์ ์ด๋ฏธ ์ ๊ณตํ๋ ํจ์๋ช ๊ณผ ๊ฐ์ ํจ์๋ฅผ ๋ง๋ค์์๋ &๋ฅผ ๋ถ์ด์ง ์์ผ๋ฉด ์๋ Perl์ ์๋ ํจ์๊ฐ ํธ์ถ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ก๋ง๋ ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ํด &๋ฅผ ์ฐ๋ผ๊ณ ํ์ง๋ง. ๊ทธ๊ฑด ์ด๋ฏธ ์ฌ์ฉ์๊ฐ Perl ๋ด๋ถ ํจ์๋ค์ ์๊ณ ์์์ ์ค๋ณต๋์ง ์๋๋ก ์ฌ์ฉํ๋๊ฒ ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ๋๋ค.
Perl์์ ํจ์ ํธ์ถ์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ท์ฝ์ ๋ฐ๋ฅด์ธ์.
- Perl์์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ํจ์(์ผ๋ช Coreํจ์)๋ฅผ ํธ์ถํ ๋๋ ์ฐ์ ์์์ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ๊ตณ์ด ๊ดํธ๋ฅผ ์ฐ์ง ์๋๋ค.(๊ฐ๋ ์ฑ์ด ๋ ๋์)
- Coreํจ์๊ฐ ์๋ ํจ์๋ ๋ฌด์กฐ๊ฑด ๊ดํธ๋ฅผ ์จ์ ํธ์ถํ๋ค.(Core ํจ์์ ์์ฐํ ๊ตฌ๋ณ๋จ) &my_func(1,2,3) -> my_func(1,2,3)
- ํจ์ํธ์ถ์ ์ฐ๋ ๊ดํธ๋ if,while๋ค์ ์กฐ๊ฑด๋ฌธ์ด ๋ค์ด๊ฐ๋ ๊ดํธ์ ๊ตฌ๋ณํ๊ธฐ ์ํด ์กฐ๊ฑด๋ฌธ ๋ค์ ๊ดํธ๋ ํญ์ ๋์์ ์ฐ๊ณ ํจ์์ ์ธ์๋ฅผ ๋ฌถ๋ ๊ดํธ๋ ํญ์ ๋ถ์ฌ ์ด๋ค.
#โ ์ฐ์ ์์์ ๋ฌธ์ ๊ฐ ์๊ฑฐ๋ ํผ๋์ด ์์ ๊ฒฝ์ฐ ๊ฒฝ์ฐ ๊ดํธ๋ฅผ ์ฌ์ฉ
print (1+2),4; # 3๋ง ์ฐํ ๊ดํธ๋ฅผ ์ธ์๋ค(LIST)์ ๋ฌถ๋ ๊ดํธ๋ก ์ธ์
print( (1+2),4 ); # 3 4 ์ฐํ
print join '-', @a,"\n"; # @a,"\n" ์ด ํ๋์ ๋ฆฌ์คํธ๋ก joinํจ์์ ์ ๋ฌ
print join('-', @a),"\n"; # @a๋ฅผ joinํ "\n"์ ๋ํ ๋ฆฌ์คํธ๊ฐ print์ ์ ๋ฌ
#Before
open( my $fh, "<", "file.txt" ) || "Can't open $!";
while(<$fh>) {
my @words = split( ' ', $_);
print( join( '-', @word), "\n" );
}
close($fh);
#After
open my $fh, '<', 'file.txt' or "Can't open $!";
while (<$fh>) {
my @words = split ' ',$_;
print join( '-', @word), "\n";
}
close $fh;
ํจ์ํธ์ถ ๊ท์ฝ๊ณผ &์ฌ์ฉ์ ๊ด๋ จํ ๊ธ์ https://www.socialtext.net/perl5/index.cgi?subroutines_called_with_the_ampersand ์ ์ฐธ๊ณ ํ์ธ์
sub max {
my ($max_so_far) = shift @_;
๋ผ๊ณ ๋์ด ์๋๋ฐ p82์ ๋ง์ง๋ง์ ๋ณด๋ฉด ์ค๋ช
๋์ด ์์ง๋ง ( )๋ก ๋ฌถ์ผ๋ฉด ๋ชฉ๋ก๋ฌธ๋งฅ(list context) ์๋๋ฉด ์ค์นผ๋ผ๋ฌธ๋งฅ(scalar context)๊ฐ ๋ฉ๋๋ค. ์์์๋ shift๋ก ์๋ธ๋ฃจํด์ ๋์ด์จ ์ธ์๋ค์ด ๋ด๊ฒจ์๋ @_
๋ฐฐ์ด์์ ๊ฐํ๋(์ค์นผ๋ผ ๊ฐ)์ ๊บผ๋ด์ ๋ฃ๊ธฐ ๋๋ฌธ์ my ($max_so_far) = shift @_;
๋ผ๊ณ ํ๋ ๊ฒ ๋ณด๋ค shift๋ก ์ค์นผ๋ผ๊ฐ ํ๋๋ฅผ ๊บผ๋ด์ ํ ๋นํ๋๊ฒ ํ์คํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์จ์ฃผ๋๊ฒ ์ข์ต๋๋ค.
sub max {
my $max_so_far = shift;
๊ทธ๋ฆฌ๊ณ ๋ณดํต @_
๋ฐฐ์ด์์ ์ธ์๋ฅผ shift๋ก ํ๋์ฉ ๊บผ๋ด ์ธ๋๋ shift๋ง ์จ๋ ๊ธฐ๋ณธ์ ์ผ๋ก @_
๋ฐฐ์ด์์ ๊บผ๋ด๋ฏ๋ก ๊ตณ์ด @_
๋ฅผ ๋ช
์์ ์ผ๋ก ์ฐ์ง ์๋ ๊ฒ์ด ๊ดํ์
๋๋ค. ์๋ ๋ค์๊ณผ ๊ฐ์ด ์จ๋ ๋ฉ๋๋ค.
sub max {
my ($max_so_far) = @_;
์ด๊ฑด my ($max_so_far)
๊ฐ list context๊ฐ ๋๊ธฐ ๋๋ฌธ์ @_
๋ฐฐ์ด์ ์ฒซ ์์๊ฐ $max_so_far์ ๋ค์ด์ค๊ฒ ๋ฉ๋๋ค. Perl์ฝ๋ฉ๊ท์ฝ์ ๋ค๋ฃจ๋ Perl Best Practices( http://oreilly.com/catalog/9780596001735 )๋ผ๋ ์ฑ
์๋ ์ธ์๋ฅผ ๋ด๊ณ ์๋ ๋ฐฐ์ด @_
์์ ์ธ์๋ฅผ ํ๋์ฉ ๊บผ๋ด๋ฉด์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๊ฐ์ ๋ํ ์ฑํฌ๋ฅผ ํด์ผ ํ ๊ฒฝ์ฐ์๋ง shift๋ฅผ ์ฌ์ฉํ๋ผ๊ณ ์ถ์ฒํฉ๋๋ค. ( ๋ค์ ์ฒ๋ผ ์ด๋ค ์ธ์๋ฅผ ๋ฐ์์ ์ฑํฌํ๊ณ undefined๋ฉด ์ด๋ค ๊ธฐ๋ณธ๊ฐ์ ์ค ๋ )
sub my_func {
my $var1 = shift;
my $var2 = shift || 'some text' ; # ์์ผ๋ฉด 'some text'
๋ณดํต ํ๋์ ์ธ์๋ง ๋ฐ๋ ๊ฒฝ์ฐ my $var = shift;
ํ์์ ์ข
์ข
์ฐ๊ธฐ๋ ํ์ง๋ง ์ ๊ฐ์ ๊ฒฝ์ฐ ์ ๊ฐ์ด ์ธ์๋ฅผ ํ๋์ฉ ๊บผ๋ด๋ฉด์ ์ด๋ค ์ฑํฌ๊ฐ ํ์ ํ์ง ์๋ ๊ฒฝ์ฐ ์ธ์์ ๋ชฉ๋ก์ด ํ๋์ ๋ณด์ด๊ฒ ์ผ๊ด์ ์ผ๋ก my (...) = @_
ํ์์ ์ฌ์ฉํฉ๋๋ค.
sub my_func {
my ($var) = @_; # ํ๋์ ์ธ์๋ฅผ ๋ฐ์
}
sub my_func2 {
my ($var1, $var2) = @_; # ๋๊ฐ์ ์ธ์๋ฅผ ๋ฐ์
}
์ฝ๋์ my ($square) = $_ * $_;
๋ ๊ตณ์ด ๊ดํธ๋ฅผ ๋ฃ์ง ์๊ณ my $square = $_ * $_;
๋ผ๊ณ ํด์ฃผ๋๊ฒ ๋ ์ ์ ํ๊ฒ ์ฃ .
my๊ฐ์ ์ฌ์ค๋ณ์( lexical variable ), use strict ํ๋๊ทธ๋ง ๊ฐ์ ๊ฒ์ ๋ํ ๋ณด์ถฉ ์ค๋ช ์ "์ต์ ์คํ์ผ Perl๋ก ๊ฐ๊ณผ์ฒ์ ํ๊ธฐ"( https://github.com/aero/perl_docs/wiki/New_Perl_Korean_Perl_Workshop_2008 ) ๋ฅผ ์ฝ์ด๋ณด์ธ์. my, our, local ๊ฐ์ด ๋ณ์์ ์์ญ๊ณผ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฒฐ์ ์ง๋ ํค์๋๋ ์ฐจ์ด์ ์ด ๋ญ์ง ํ์คํ๊ฒ ์ดํดํด์ผ ํฉ๋๋ค.
ํ๋ Perl์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก
#!/usr/bin/env perl
use strict;
use warnings;
์ฒ๋ผ ์์ํ๋๊ฒ ๊ฑฐ์ ํ์ค์ด๋ ๊ผญ ๊ธฐ์ตํ๊ณ ๋ฃ๋๋ก ํฉ์๋ค. ์ด๋ ๊ฒ strict ํ๋๊ทธ๋ง๋ฅผ ์ฐ๋ฉด ๋ณ์๋ my,our,local ํค์๋์ค ํ๋๋ก ๋ช ์์ ์ผ๋ก ์ ์ธํ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฉ๋๋ค. ์ด๊ฒ์ ๋ฃ์ด ์์ ์ ์ฝ๋์ ์๋ฌ๊ฐ ๋๋ค๋ฉด ๋น์ ์ ์๋ Perl์ฝ๋๋ฅผ ์ฐ๊ณ ์๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ๋ ์ด๊ฒ์ ๋นผ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค ํ์ง ๋ง๊ณ , ์์ ์ ์ฝ๋๋ฅผ ํ๋ Perl์ ๋ง๊ฒ ๊ณ ์น์๊ธฐ ๋ฐ๋๋๋ค.
"์ด๋ค ํ๋ก๊ทธ๋๋จธ๋ค์ ๋ฐํ ๊ฐ์ด ์์ ๊ฒฝ์ฐ ํญ์ return์ ์ฌ์ฉํด์ ๊ทธ ๊ฐ์ด ๋ฐํ ๊ฐ์ด ๋ผ๊ณ ๋ง์น ์ค๋ช ์ ๋ฌ๋ฏ์ด ๋ช ์ํ๋ ๊ฒ์ ์ข์ํฉ๋๋ค. .... ํ์ง๋ง ๋ง์ ํ ํ๋ก๊ทธ๋๋จธ๋ค์ return์ ์ผ๊ณฑ ๋ฌธ์๋ฅผ ๋ ์ ๋ ฅํ๋ ๊ฒ์ผ ๋ฟ์ด๋ผ๊ณ ๋ฏฟ๊ณ ์์ต๋๋ค." ๋ผ๋ ๋ง์ด ์๋๋ฐ Perl ํจ์์์๋ ๋ง์ง๋ง์ผ๋ก ํ๊ฐ๋ ๊ฐ์ด ์๋์ผ๋ก ๋ฆฌํด๊ฐ์ผ๋ก ์ฌ์ฉ๋๊ธด ํ์ง๋ง ์ด๋ง์ ๋ฌด์ํ์๊ณ ํจ์์์ ์ด๋ค ๊ฐ์ ๋ฆฌํดํด์ผ๋๋ฉด ๋ช ์์ ์ผ๋ก return ๋ฌธ์ ์จ์ ํ๋๊ฒ ์ข์ต๋๋ค. Perl์์ ํจ์์ ์ฒ์๊ณผ ๋์ ๊ฐ์ธ๋ { } ๋ธ๋ญ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํ์์ ์ฐ์ด๋ ์ฌํ ๋ธ๋ญ๋ค๋ ๋ ๋ฆฝ์ ์ธ ๋ ์์ปฌ์์ญ(lexical scope)๋ฅผ ๊ฐ์ง๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ธ๋ญ๋ค์ ๋ธ๋ญ์ด ๋๋ ๋ ๋ง์ง๋ง์ ํ๊ฐ๋ ๊ฐ์ ๋๊น๋๋ค.
sub my_func {
my ($var) = @_;
return $var * $var; # ๊ทธ๋ฅ $var * $var ๋ผ๊ณ ํด๋ ๋์ง๋ง ๋ช
์์ ์ผ๋ก return ํด์ฃผ์!
}
my $str = do { local $/; <$fh> }; # $fh ํ์ผํธ๋ค๋ก ์ฐ ํ์ผ๋ด์ฉ ๋ชจ๋๊ฐ ๋์ด๊ฐ
my @new = map { $_ =~ s/A/a/g; $_ } @old; # @old๋ฐฐ์ด์ ๋ด๊ธด ์คํธ๋ง๋ค์์ ๋ชจ๋ ๋๋ฌธ์ A๋ฅผ ์๋ฌธ์๋ก ๋ฐ๊พผ ๋ฌธ์์ด์ด ์ฐจ๋ก๋ก ๋์ด๊ฐ
์ผ๋จ do ๋ธ๋ญ๊ณผ map ํจ์๋ฅผ ์ ๋ชจ๋ฅธ๋ค ์ณ๋ ํด๋น ๋ธ๋ญ๋ค์ ๋ง์ง๋ง ํ๊ฐ๊ฐ <$fh>, $_ ๊ฐ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋์ด๊ฐ๋ค๋ ์ฌ์ค์ ์์ ์ค๋ช ์ ํตํด ์ง์๊ฐ๋ฅํ ๊ฒ๋๋ค. ๋ง์ง๋ง ๋์ค๊ณผ ๊ฐ์ด ํจ์ํํ๊ฐ ์๋ simpleํ ๋ธ๋ญ์์๋ ๋ธ๋ญ์ ๋ง์ง๋ง ํ๊ฐ๊ฐ์ ๋๊ฒจ์ฃผ๋ ํ ํฌ๋์ ์ ์ฉํ๊ฒ ์ฐ์ง๋ง ์ผ๋ฐ์ ์ธ ํจ์์์๋ ํจ์ ์ค๊ฐ ๋ถ๋ถ๋ฑ์์๋ return ํ ์ ์์ผ๋ฏ๋ก ํญ์ ๋ช ์์ ์ผ๋ก returnํด์ฃผ๋ ๊ฒ์ด ๋์ค์๋ผ๋ ํจ์์ ์ด๋์์ ๋น ์ ธ๋๊ฐ๋์ง ๋ฑ์ ํจ์์ ๊ตฌ์กฐ๋ฅผ ํ์ ํ๋๋ฐ ๋์์ด ๋ฉ๋๋ค.
open CONFIG, "<dino";
open LOG, ">>logfile";
print LOG "some text\n";
๊ฐ์ ํ์์ bareword(์ธ์ฉ๋ถํธ๋ก ๊ฐ์ธ์ง ์์ ๋ฌธ์์ด - ์์์ CONFIG,LOG)ํ์ผํธ๋ค๊ณผ 2์ธ์ ํ์์ open๋ฌธ์ ์๋ ๋ฐฉ์์ ๋๋ค. ํ๋์ ์คํ์ผ์ lexical ๋ณ์ ํ์ผํธ๋ค์ 3์ธ์ ํ์ open์ ์ฐ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ 4์ฅ ๋ฆฌ๋ทฐ ๋ง์ง๋ง์ ๋งํฌ๊ฑด ๋ฌธ์์ ์์ธํ ์ค๋ช ๋์ด ์์ต๋๋ค. ( ์ถ๊ฐ์ฐธ๊ณ : https://www.socialtext.net/perl5/index.cgi?bareword_uppercase_filehandles , https://www.socialtext.net/perl5/index.cgi?two_argument_open )
open my $CONFIG, '<', 'dino';
open my $LOG, '>>', 'logfile';
print {$LOG} "some text\n"; # openํ $LOG ํ์ผํธ๋ค์ ์ฐ๊ธฐ
bareword ( https://www.socialtext.net/perl5/index.cgi?bareword )๋ฅผ ๋ ์์ธํ ์ค๋ช
ํ์๋ฉด "
๋'
๋ฑ์ ์ธ์ฉ๋ถํธ๋ก ๊ฐ์ธ์ง ์์ ๋ฒ๊ฑฐ๋ฒ์? ๋ฌธ์์ด์
๋๋ค. ํ์ง๋ง ์ฌ๊ธฐ์ ๊ท์น์ด ์์ต๋๋ค. "์ํ๋ฒณ๋์๋ฌธ์,_
๋ก ์์ํ๋ฉฐ ๊ทธ ๋ค๋ ์ํ๋ฒณ๋์๋ฌธ์,_
,์ซ์์ 3๊ฐ์ง์ ์กฐํฉ์ ์ฌ์ฉํ ์ ์๋ค"
abc1 O
_a_b O
_1ab O
1abc X
_a1_ O
๊ทธ๋ฌ๋ฉด bareword๊ฐ ์ ์ค์ํ๋?
ํ์์ ๋ณ์์ด๋ฆ์ด๋ ํจ์์ด๋ฆ ๋ฑ์์ ์ด๋ฆ์ ์๋ณ์(identifier)๋ผ๊ณ ํฉ๋๋ค. ์๋ณ์๋ ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ค ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑ์์๋ฅผ ๊ตฌ๋ณํ๋ ์ด๋ฆํ๊ฐ์ ๊ฒ์ด๋ฉฐ ์๋ฅผ ๋ค๋ฉด ์ค์นผ๋ผ๋ณ์ $my_var
์์ my_var๊ฐ ์๋ณ์๊ฐ ๋ฉ๋๋ค. sub my_func { ...}
๊ฐ์ ํจ์์์๋ my_func๊ฐ ์๋ณ์๊ฐ ๋์ง์ perl์ ์ค์นผ๋ผ๋ณ์๋ ์๋ณ์ ์์ $
, ๋ฐฐ์ด์ @
, ํด์๋ %
๊ฐ์(ํจ์๋ ๋ด๋ถ์ ์ผ๋ก &๋ฅผ ์์ ๋ถ์ธ๊ฒ์ผ๋ก ์ธ์) sigil์ ๋ถ์ฌ์ ๋ณ์๋ผ๊ณ ์ ์ ํฉ๋๋ค. ๋ฐ๋ผ์ sigil์ด ์๋ ๋ค๋ฅธ ์ธ์ด๋ค๊ณผ ๋ฌ๋ฆฌ Perl์ ๊ฐ์ ์๋ณ์๋ฅผ ๊ฐ์ง๋ ๋ค๋ฅธ ํํ์ ๋ณ์์ ํจ์( $abc, @abc, %abc, sub abc { ... }
)๊ฐ ๋์์ ์กด์ฌ๊ฐ๋ฅํฉ๋๋ค.
์ด์ ์ ๋ฆฌํ๋ฉด ๋ณ์๋ ํจ์๋ช
์ sigil+identifier(์๋ณ์) ๋ผ๊ณ ํ ์ ์๊ฒ ์ฃ . ๊ทธ๋ฐ๋ฐ ์ฌ๋ฏธ์๋๊ฑด identifier์ ์ด๋ฆ๊ท์น์ด bareword ์ด๋ฆ๊ท์น๊ณผ ๊ฐ๋ค๋ ๊ฒ๋๋ค. ๋ณ์๋ช
์ bareword์ ๊ฐ์ "์ํ๋ฒณ๋์๋ฌธ์,_
๋ก ์์ํ๋ฉฐ ๊ทธ ๋ค๋ ์ํ๋ฒณ๋์๋ฌธ์,_
,์ซ์์ 3๊ฐ์ง์ ์กฐํฉ์ ์ฌ์ฉํ ์ ์๋ค"
$ab2 # O
$1bc # X
@_a_ # O
%A__ # O
์ฌ๊ธฐ์์ ์ฃผ์ํด์ผ ํ ๊ฒ์ identifier์ ์ต๋ ๊ธธ์ด๋ 251์ ๋ผ๋ ๊ฒ๋๋ค. ์ด๊ฒ์ ๋ค๋ฅด๊ฒ ๋งํ๋ฉด 251์๊ฐ ๋์ด๊ฐ๋ ๋ณ์๋ช ์ด๋ ํจ์๋ช ์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด ๋๊ฒ ์ฃ . ๊ทธ๋ ๊ฒ ์ฌ์ฉํ ์ผ๋ ์๊ฒ ์ง๋ง์.
๊ทธ๋ฆฌ๊ณ ๋ ํ๋ ์ฃผ์ํด์ผ ๋๋ ๊ฒ์ identifier๊ฐ ๋์ค์ ํด์๋ผ๋ ๊ฑธ ๋ฐฐ์ธ๋ ํด์ํค์ bareword๋ฅผ ์ฌ์ฉํ ๋ ๊ท์น์๋ ๋ ๊ฐ์ด ์ ์ฉ๋๋ค๋ ๊ฒ๋๋ค. ์ด๊ฒ์ ํด์์์ ๋ค์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
p116์
if ( ! open LOG, ">>logfile" ) {
die "Cannot create logfile: $!";
}
์ด๋ฐ์์ผ๋ก ํ์ผ open์ ์๋ฌ์ฒ๋ฆฌํ๋ ๊ฑด ์ด๋์ ๋์จ ํด๊ดดํ ์ฝ๋์ธ์ง ๋ชจ๋ฅด๊ฒ ๊ตฐ์. ์ ๊ฒ์ ํ๋์ ์คํ์ผ๊ณผ ์๋ฌ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ๊พธ๋ฉด
open my $LOG, '>>', 'logfile' or die "Cannot create logfile : $!";
ํ์์ผ๋ก ์๋๋ค. or ์ฐ์ฐ์๋ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋ฎ์ ์ฐ์ฐ์์ด๊ธฐ ๋๋ฌธ์ or ์์ชฝ์ open๋ฌธ์ด ์คํจํ๋ฉด ๋ค์ die๊ฐ ์คํ๋ฉ๋๋ค. Perl 5.10 ์ด์์์๋ ์๋์ฒ๋ผ use autodie; ๋ผ๋ ํ๋๊ทธ๋ง( http://search.cpan.org/perldoc?autodie )๋ฅผ ์ฐ๋ฉด ๋ฐ๋ก ์์ธ์ฒ๋ฆฌ die๋ฅผ ํด์ฃผ์ง ์์๋ open์ ์คํจํ๋ฉด ์๋์ผ๋ก dieํ๋ฉด์ ์๋ฌ๋ฉ์์ง๋ฅผ ๋ฟ๋ ค์ค๋๋ค.
use autodie;
open my $LOG, '>>', 'logfile';
ํ์ผํธ๋ค์ ์ด๋ค ๋ฌธ์์ด์ ์ธ๋ print $fh "some text\n";
๋ผ๊ณ ํด๋ ๋์ง๋ง Perl Best Practices์์๋ ํ์ผํธ๋ค์ { }๋ฅผ ๋ฌถ์ด print {$fh} "some text\n";
ํ์์ผ๋ก ์๋๋ค. ๋ง์ฝ ์ฌ๋ฌ ํ์ผํธ๋ค์ด ์ด๋ค @fh ๋ผ๋ ๋ฐฐ์ด์ ๋ด๊ฒจ์๋ค๊ณ ํ์๋ ์ฒซ๋ฒ์งธ ํ์ผํธ๋ค์ธ $fh[0]์ ์ฐ๊ฒ ๋ค๊ณ print $fh[0] "some text\n";
๋ผ๊ณ ํ๋ฉด ์ํ๋ ๋๋ก ๋์ํ์ง ์๋๋ฐ ์ด๋ด๋๋ ์์ ์ค์นผ๋ผ๋ณ์์ $fh[0]์ ๋ด์์ ์จ๋ ๋์ง๋ง ๋ฐ๋ก print {$fh[0]} "some text\n";
๋ผ๊ณ ํ๋ฉด ์ ๋๋ก ๋์ํฉ๋๋ค. ์ด๊ฒ์ print ๋ฌธ์ด ๋ง์น ๊ฐ์ ๊ฐ์ฒด ํธ์ถํ์(indirect object notation)์ฒ๋ผ ๋์ํ๊ธฐ ๋๋ฌธ์ธ๋ฐ ๊ฐ์ ๊ฐ์ฒด ํธ์ถํ์์ [ํจ์๋ช
] [๊ฐ์ฒด] [์ธ์] ํ์์ผ๋ก ์ฐ๋ฉด ๊ฐ์ฒด์ ํจ์๋ช
์ ํธ์ถํ๋ ๊ฒ์ผ๋ก ๊ฐ์ฒด์ ์์น์ ์ค๋ ๊ฒ์ด bareword๋ ์์ํ ์ค์นผ๋ผ๋ณ์๊ฐ ์๋ ๊ฒฝ์ฐ { }๋ก ๋ฌถ์ด์ค์ผ ๊ฐ์ฒด๋ก ์ธ์ํฉ๋๋ค. ๋ฐ๋ผ์ print,printf,say๋ฌธ ๋ฑ์ ๋ ์์ปฌ ํ์ผํธ๋ค์ ์ง์ ํด์ค ๊ฒฝ์ฐ ํญ์ { }๋ก ๋ฌถ์ด์ฃผ๋ ๊ฒ์ด ์๊ฐ์ ์ผ๋ก๋ ๊ตฌ๋ณ์ด ์ฝ๊ณ ๋ค์ํ ๊ฒฝ์ฐ์ ๋ํด ์ผ๊ด์ฑ์ ๊ฐ์ง ์ ์์ผ๋ฏ๋ก ์ข์ต๋๋ค.
ํด์๊ฐ์ ๋ค์์ฒ๋ผ $family_name{"fred"} = "flintstone";
์ค์ ํ ๋ { } ์์ ํด์ํค๋ฅผ "fred" ์ฒ๋ผ ํฐ๋ฐ์ดํ๋ก ๋ฌถ์๋๋ฐ ์ฌ๊ธฐ๋ bareword๊ฐ ์ค๋ฉด ์๋์ผ๋ก ๋ฌธ์์ด๋ก ์ธ์ํ๋ฏ๋ก ๊ตณ์ด " "๋ ' '๊ฐ์ ์ธ์ฉ๋ถํธ๋ก ๋ฌถ์ ํ์๊ฐ ์์ด $family_name{fred} = 'flintstone';
์ฒ๋ผ ํ๋ฉด ๋ฉ๋๋ค. ๋จ ํค๋ก ์ฐ์ด๋ ๋ฌธ์์ด์ ๊ณต๋ฐฑ์ด ๋ ๋ค๋ฅธ ์๋ฏธ๋ก ์คํด๋ ์ ์๋ ํน์๋ฌธ์๋ฑ์ด ํฌํจ๋ ๋ฌธ์์ด ์๋ฅผ ๋ค๋ฉด $a๊ฐ์ ๋ณ์ํํ์ ๋ฌธ์์ด์ ๋ณด๊ฐ(interpolation)๋ ๋ณ์ ๊ฐ์ด ์๋๋ผ ํค๋ฅผ ๋ฌธ์ ๊ทธ๋๋ก ํค๋ก ์ฐ๊ณ ์ ํ๋ฉด ๋ค์ ์ฒ๋ผ ํด์ผ๋๊ฒ ์ฃ
$hash{'text with space'} = 1;
$hash{'$a'} = 2;
$hash{'@_@'} = 3;
$hash{'^_^'} = 4;
$hash{'2.0'} = 5; # $hash{2.0} = 5; ๋ผ๊ณ ํ๋ฉด ํด์ํค๋ ๋ฌธ์์ด์ด๋ ์ซ์ 2.0์ด ๋ฌธ์์ดํ ๋์ด 2๊ฐ ๋์ด ํด์ํค๊ฐ ๋ฌธ์์ด 2๊ฐ ๋จ
์ด๋ฐ ๊ฒฝ์ฐ๋ ๋๋ฌผ๊ธฐ ๋๋ฌธ์ ๋ณดํต์ ๊ฒฝ์ฐ ๊ตณ์ด ํค๋ฌธ์์ด์ ์ผ์ผ์ด ์ธ์ฉ๋ถํธ๋ก ๊ฐ์ธ์ฃผ๋ ๊ฑด ๋ถํ์ํ ์ผ์ ๋๋ค.
์ฌ๊ธฐ์ ์ ๊น! 5์ฅ์์ ์ค๋ช ํ bareword์ ๊ท์น์ด ํด์ํค์์ bareword๋ฅผ ์ฌ์ฉํ ๋๋ ๊ทธ๋๋ก ์ ์ฉ๋๋ค๊ณ ๋งํ์ต๋๋ค. ๋ฐ๋ผ์ hash ํค๋ฅผ bareword๋ก ์ฌ์ฉํ ๋ ๊ทธ ๊ท์น์ ์ด๊ธ๋๋ ๊ฒฝ์ฐ๋ ์ธ์ฉ๋ถํธ๋ก ๊ผญ ๊ฐ์ธ์ค์ผ ํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก bareword๋ก ์ง์ ํ๋ ํด์ํค์ ์ต๋ ๊ธธ์ด๋ 251์๋ก ์ ํ๋ฉ๋๋ค.( ์ธ์ฉ๋ถํธ๋ก ๋ฌถ์ ํด์ํค ๋ฌธ์์ด์ ๊ธธ์ด์๋ ์ด๋ฐ์ ํ์ด ์์ต๋๋ค.)
$hash{1ab} = 1; # ์๋ฌ
$hash{'1ab'} = 1; # ์ซ์๋ก ์์ํ๋ฏ๋ก
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํด์๋ฅผ ์ฌ์ฉํ๋ฉฐ ํด์ํค๋ฅผ ์๋์ผ๋ก ์ง์ ํ ๋ ์ด๋ฌํ ์ ์ฝ์ฌํญ์ ๋ง๋๋ ๊ฒฝ์ฐ๋ ๋๋ฌผ๊ธฐ ๋๋ฌธ์ ํด์ํค๋ฅผ ํน์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด barewordํํ๋ก ์ฐ๋ ๊ฒ์ด ๊ดํ์ ๋๋ค.
์ฒซ๋ฒ์งธ ์ฝ๋์ ์ฒซ์ค
foreach $person (qw< barney fred >) {
...
์ ๋ฃจํ์ ์ฐ์ด๋ ์์๋ณ์๋ก ๊ทธ๋ฅ $person์ ์ฐ๋๋ฐ ์ด๋ ๊ฒ ๋ฃจํ์ ํ์์ ์ผ๋ก ์ฐ์ด๋ ๋ณ์๋ ์์์ ๋ฐฐ์ด my๋ณ์๋ฅผ ์ฐ๋๊ฒ ์ ์์ ๋๋ค. ( qw์ฐ์ฐ์์ ๊ฐ์ด ์ฐ๋ ๊ตฌ๋ถ์๋ ์ ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํธํ๋ /๋ก ๋ฐ๊พธ๋ฉด )
foreach my $person (qw/barney fred/) {
...
์ด๋ ๊ฒ ํ๋ฉด ๋ฃจํ ์ด์ ์ $person์ด๋ผ๋ ๋ณ์๊ฐ ์ ์ ๋์๋ค๊ณ ํด๋ ๋ฃจํ๋ด์์๋ ์ด์ ์ ์ ์๋ ๊ฒ๊ณผ ์๊ด์์ด ๋ ๋ฆฝ์ ์ธ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฏ๋ก ์๋ก ์ ํ ๊ฐ์ญ์ด ์๊ณ ์ํฅ๋ ๋ฏธ์น์ง ์๊ฒ ๋ฉ๋๋ค. ์ด๊ฒ์ด Python์ด๋ Ruby์๋ ์๋ my๋ก ์ ์๋๋ ๋ ์์ปฌ๋ณ์์ ์ถ๋ณต์ด์ฃ :)
%some_hash = ( "foo", 35, "bar", 12.4 );
๊ฐ์ ํด์์ ์๋ฅผ =>
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ %some_hash = ( foo => 35, bar => 12.4);
๋ก ๋ฐ๊ฟ ์ธ ์ ์์ต๋๋ค. ์ฑ
์์๋ foo๋ bar๊ฐ์ ํด์ํค์ %some_hash = ( "foo" => 35, "bar" => 12.4);
์ฒ๋ผ ์ธ์ฉ๋ถํธ๋ฅผ ๊ฐ์ธ๋จ์ง๋ง =>
์ฐ์ฐ์๋ ์ผ์ชฝ์ ์ค๋ bareword๋ ์ธ์ฉ๋ถํธ๋ก ๊ฐ์ธ์ง ์์๋ ์๋์ผ๋ก ๋ฌธ์์ดํ ํ๊ธฐ ๋๋ฌธ์ ์์์ { }์์ bareword ํด์ํค๋ฅผ ์ฐ๋ ๊ฒฝ์ฐ ์ฒ๋ผ ์์ธ์ ์ธ ํน์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ๊ตณ์ด ์ธ์ฉ ๋ถํธ๋ก ๊ฐ์ ํ์๊ฐ ์์ต๋๋ค. ๋ค์ ๋งํ๋ฉด =>
๋ ์์ ์ ์ผ์ชฝ์ ์ค๋ bareword๋ฅผ ์๋์ผ๋ก ๋ฌธ์์ดํ ํ๋ค๋ ๊ฒ ๋นผ๊ณ ๋ ,์ ๋์ผํ ๊ธฐ๋ฅ์ ํ๋ค๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค. ์๋ฅผ๋ค๋ฉด print 'a','b','c','d';
๋ ์ด์ํ๊ฒ ๋ณด์ผ์ง ๋ชจ๋ฅด์ง๋ง print a=>b=>c=>'d';
๋ก ์จ๋ ๋๊ฐ์ด ๋์ํ๋ค๋ ๊ฑฐ์ฃ .
๊ทธ๋ฆฌ๊ณ Perl์์ -
๊ฐ bareword ์์ ์ค๋ฉด ๋์ด ๊ฒฐํฉ๋ ๋ฌธ์์ด์ด ๋ฉ๋๋ค. ๊ทธ๋์ (-width => 200, -height => 300)
๊ฐ์ ํ์์ ํค๋ฅผ ์ฌ์ฉ ํ ์ ์์ต๋๋ค. ์ด๋ฐ ํ์์ ํค๋ ๋๋ฌผ๊ฒ CGI๋ชจ๋์ด๋ Tk ๋ชจ๋๋ฑ์์ ์ธ์๋ฅผ ๋๋ฆ๋๋ก ๊ท์น์ ์ํด ์ฑํฌํ๊ธฐ ์ํด์ ํจ์์ ์ธ์๋ก ํด์ํํ์ ๋ฆฌ์คํธ๋ฅผ ๋๊ฒจ์ค ๋ ์ฌ์ฉ๋๊ธฐ๋ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ bareword ์์ +
๋ฅผ ๋ถ์ด๋ฉด ํด๋น bareword๋ฅผ ๋ฌธ์์ด์ด ์๋ ํด๋น ์ด๋ฆ์ ํจ์๋ก ์ธ์ํ์ฌ ํจ์ํธ์ถ์ ๊ฒฐ๊ณผ ๊ฐ์ ์ทจํฉ๋๋ค.
my $var1 = $hash{shift}; # shift๋ ๋ฌธ์์ด ๊ทธ๋๋ก์ ํค์ด๋ฆ
my $var2 = $hash{+shift}; # my $var2 = $hash{shift()}; ๊ณผ ๊ฐ์ ์๋ฏธ๋ก shift ํจ์๊ฐ ๊ธฐ๋ณธ์ผ๋ก @_๋ฐฐ์ด์์ shiftํ๊ฐ์ ํค๋ก ์ฌ์ฉ
each ์์ ์ฝ๋ ์ฒซ์ค
while ( ($key, $value) = each %hash ) {
...
๋ ๋ฃจํ๋ด์์ ํ์ ์ ์ธ my ๋ณ์๋ฅผ ์จ์
while ( my ($key, $value) = each %hash ) {
...
ํ์์ผ๋ก ์ฐ๋๊ฒ ์ ์์
๋๋ค. my๋ณ์๋ฅผ ๊ฐ๋ฅด์ณ์ค ๋๊ณ ํ์๋๋ ์ฝ๋๋ค์ ์ ์ด๋ฐ ํ์์ผ๋ก ์์จ๋จ๋์ง ๊ฐ์ธ์ ์ผ๋ก ๋ถ๋ง์ด๊ตฐ์. ์ดํ์๋ ๊ณ์ ๊ทธ๋ฐ์์ ์ฝ๋๋ค์ด ๋์ค๋๋ฐ ๋ฃจํ๋ด์ ํ์ ๋์ด ์ฐ์ด๋ ๋ณ์์๋ ๊ผญ my๋ฅผ ์ฐ๋๋ก ํฉ์๋ค. ๋ญ ์ ๊ฐ ๋ฐ๋ก ๋ง ์ํด๋ ์์์ ๋งํ๋ use strict;
ํ๋๊ทธ๋ง๋ฅผ ์ฐ๋ฉด ์์์ ์๋ฌ๋ ํ
์ง๋ง์~
์ฑ
์ ๋ท์ชฝ์์ ๋ค๋ฃจ๋ ๊ณ ๊ธ์ฃผ์ ์ง๋ง ๋ฏธ๋ฆฌ ์ค๋ช
๋๋ฆฌ๋ฉด ์์์ ๋ฐฐ์ด ๋ฐฐ์ด ์ฌ๋ผ์ด์ค์ ๋น์ทํ ํด์ ์ฌ๋ผ์ด์ค๋ผ๋ ๊ฒ์ด ์์ต๋๋ค.
my %hash = ( a=>1, b=>2, c=>3, d=>4);
์์ ํค a,c,d์ ๋ํ ๊ฐ์ ๋ฝ์๋ด๋ ค๋ฉด my @values = ( $hash{a}, $hash{c}, $hash{d} );
๋ผ๊ณ ํ ์ ์์ ๊ฒ๋๋ค. ์ด๊ฒ์ ํด์ ์ฌ๋ผ์ด์ค๋ก ์ค์ฌ์ฐ๋ฉด my @values = @hash{'a','c','d'};
๋ผ๊ณ ํ ์ ์์ต๋๋ค. ์ด๊ฑด my @values = @hash{qw/a c d/};
๋ผ๊ณ ํด๋ ๋๋ ๊ฑด ์ผ์ค๊ฐ ์ข ์์ผ์๋ฉด ๋ณ ๋ฌด๋ฆฌ์์ด ์ดํด๋์ค๋ฏ..
ํด์์ ๋ํด ์ข ๋ ์์ธํ ์๊ณ ์ถ์ผ์๋ฉด http://perl101.org/hashes.html์ ๋ณด์ธ์
Learning Perl 5ํ์ ์ข์์ฑ ์ด์ง๋ง Perl์ ์ ๋๋ก ์ฌ์ฉํ๋ ค๋ฉด ํ์ํ๊ณ ์ดํดํด์ผํ๋ ๋ ํผ๋ฐ์ค( http://perldoc.perl.org/perlreftut.html , http://perldoc.perl.org/perlref.html )์ ๋ณต์กํ ์๋ฃ๊ตฌ์กฐ( http://perldoc.perl.org/perldsc.html ), ๋ชจ๋์ ์๋ฆฌ, ๊ฐ์ฒด์งํฅ(OOP) ๋ฑ์ ๋ํด์ ๋ค๋ฃจ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ์ฑ ์ ๋ค ๋ดค๋ค๊ณ Perl์ ๋ค ๊ณต๋ถํ๋ค๊ณ ์๊ฐํ์๋ฉด ์๋ฉ๋๋ค. ์๋ ์ด ์ฑ ๋ค์์ผ๋ก ๋ณด๋๋ก ๊ธฐํ๋ ์ฑ ์ด Intermediated Perl ( http://oreilly.com/catalog/9780596102067 ) ์ด๋ ์ฑ ์ ๋๋ค. ์ด ์ฑ ์ ์ฝ๊ฐ ์ค๋๋๊ณ ( ๊ฐ์ ํ์ ์ค๋น์ค์ด๋ผ๋ ์๋ฌธ์ด ์์) ๋ฒ์ญ์๊ฐ ์์ผ๋ ์๋ฌธ์ ๋ณด์ ์ผ ํ๋ฉฐ, ๊ฐ์ธ์ ์ผ๋ก Learning Perl 5ํ์์ ๋ค๋ฃจ์ง ์์ Perl ์ ๋ฐ์ ๋ค๋ฃจ๋ ์ฑ ์ผ๋ก ์ ๋ ๋ฌด๋ฃ๋ก ๊ณต๊ฐ๋ Beginning Perl( http://www.perl.org/books/beginning-perl/ ) ๊ณผ ์ต๊ทผ์ ๋์จ ๋ฌด๋ฃ์ฑ Modern Perl ( http://www.onyxneon.com/books/modern_perl/index.html )์ ๋ณด์๊ธธ ์ถ์ฒ ๋๋ฆฝ๋๋ค. ๊ฒฐ๊ตญ์ ๋ชจ๋ ์ ๋ต์ perldoc( http://perldoc.perl.org/ )๋ฌธ์์ ์๋ค๋ ๊ฒ๋ ๋ช ์ฌํ์๊ณ ~
- Perl Beginners' Site http://perl-begin.org/
- Perl Training Australia - Course Notes http://perltraining.com.au/notes.html
- Perl Training Australia - Perl Tips http://perltraining.com.au/tips/
- Fundamentals of Perl http://szabgab.com/fundamentals_of_perl.html
- Welcome to Perl Programming - MIT IAP http://stuff.mit.edu/iap/perl/slides/slides.html
- Perl Monks Tutorial http://perlmonks.org/?node=tutorials
- Steve's Perl Tutorial http://www.resoo.org/docs/perl/perl_tutorial/tutorial.html
- Perl 101 - Things Every Perl Programmer Should Know http://perl101.org/
- What Every Perl Programmer Should Know http://houston.pm.org/talks/2006talks/0604Talk/tiddlywiki_weppsk.html
- Object-Oriented Programming in Perl Tutorial http://urth.org/~autarch/new-pod/html/perlootut.pod.html
- gypark๋์ Wiki์ Perl์น์ http://gypark.pe.kr/wiki/perl
- "Perl์ ์ ์ข์ ์ฝ๋ฉ ์ต๊ด" ์์ฝ ๋ฒ์ญ http://cafe.naver.com/perlstudy/655
- ์๋ก์ด Perl OOP๋ก ๊ฐ๊ณผ์ฒ์ ํ๊ธฐ https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=1bUdjm4YzxlLhopigzO0drUOiGYm7SxjuiSn0FJCaS-AYXuaF5Uvqcpv-BAUk&hl=ko
- Perl5ํธ(์ผํ๋ฒ์ญ๊ธฐ๋ฅผ ํตํด์ ๋ด) http://j2k.naver.com/j2k_frame.php/korean/www.geocities.jp/ky_webid/perl5/index.html
- ์ํ ์ฝ๋์ ์ํ Perl ์ ๋ฌธ - ์ผ๋ณธ์ด ์ธ์ดํธ(์ผํ๋ฒ์ญ๊ธฐ๋ฅผ ํตํด์ ๋ด) http://j2k.naver.com/j2k_frame.php/korean/d.hatena.ne.jp/perlcodesample/20080229/1204271923
- Perl๊ฐ์ข - ์ผ๋ณธ์ด ์ธ์ดํธ(์ผํ๋ฒ์ญ๊ธฐ๋ฅผ ํตํด์ ๋ด) http://j2k.naver.com/j2k_frame.php/korean/www.rfs.jp/sb/perl/
- perldoc์ ์ผ๋ณธ์ด๋ฒ์ญ(์ผํ๋ฒ์ญ๊ธฐ๋ฅผ ํตํด์ ๋ด) http://j2k.naver.com/j2k_frame.php/korean/perldoc.jp/
๋ณด์๊ณ ๊ถ๊ธํ์๊ฑฐ๋ ํ๊ณ ์ถ์๋ง์ด ์์ผ์๋ฉด https://github.com/aero/perl_docs/issues ์ ๋จ๊ฒจ์ฃผ์ธ์.