2025-02-10T05:29:29

This commit is contained in:
2025-02-10 05:29:29 +09:00
parent e00dd1bfbf
commit 6f1a75f466
45 changed files with 69 additions and 145 deletions

76
docs/12_subroutine.md Normal file
View File

@@ -0,0 +1,76 @@
# 서브루틴
```perl
sub do_something {
print "Hello.\n";
}
&do_something; # 또는 do_something();
```
## 매개변수 전달과 결과값의 반환
서브루틴의 매개변수는 `@_`라는 특수 변수를 통해서 전달됩니다.
그리고, `return` 키워드를 통해서 서브루틴의 결과 값을 반환합니다. 만일, 서브루틴에 return 키워드가 없다면 마지막 줄이 반환값이 됩니다.
```perl
print &do_something('Charlie', 100)."\n";
sub do_something {
return "Hello, $_[0]. Your number is $_[1].";
# 또는, "Hello, $_[0]. Your number is $_[1].";
}
```
`@_`는 참조에 의한 전달이므로 서브루틴 내에서 배열의 값을 변경하면, 서브루틴 외부에서도 변경된 상태가 됩니다. 전달된 매개변수의 값이 변경되지 않도록 하려면 별도의 지역 변수에 값을 복사해서 사용해야 합니다.
```perl
my @var = (1..5);
&do_something(@var);
print "@var\n";
sub do_something {
for (@_){
$_ += 2;
}
}
```
서브루틴은 연산이 실패한 경우 등에 `undef`를 반환할 수 있습니다. 그리고, `defined`를 통해서 변수에 값이 할당되었는지를 판별할 수 있습니다.
```perl
my $max = &max(3..5);
if (defined $max){
print "$max\n";
} else {
print "Oops.\n";
}
sub max{
return undef unless defined $_[0];
my $val = $_[0];
for (@_){
$val = $_ if $val < $_;
}
return $val;
}
```
서브루틴의 매개변수로 배열이나 해시를 전달하려면 참조를 사용하면 됩니다.
```perl
my @var1 = (1..5);
my @var2 = (6..10);
&do_something(\@var1, \@var2);
sub do_something {
my $ref1 = $_[0];
my $ref2 = $_[1];
$ref1->[0] = 0;
my @ret = ();
return @ret;
}
```