리스트와 배열
리스트 란 스칼라에 순서를 붙여서 나열한 것으로, 리스트 안에서 스칼라 위치에 따라 자유롭게 접근할 수 있습니다.
그리고 그 리스트를 변수로 한 것을 배열이라고 합니다.
※리스트는 [데이터] 배열은 [변수]를 의미합니다.
배열 이름은 @(앳) + 영문자로 시작하며 그 이후는 숫자 영문자 그리고 언더파(_)를 사용할 수 있습니다.
그리고 대문자 소문자를 구별합니다.
@a 와 @A는 별개로 취급합니다.
변수명에 사용가능한 문자 | |
@abc123 | 변수명으로 사용 가능 |
@123abc | 숫자로 시작하기 때문에 사용 불가 |
@abc_123 | 언더바(_) 사용 가능 |
@abc-123 | 마이너스 기호와 사용 불가 |
배열 연산자
배열에는 숫자나 문자를 대입할 수 있습니다.
구문열 | 내용 |
@x = (1, 2, 3); | @x 에 1, 2, 3 를 순서대로 대입(숫자) |
@y = (“apple”, “orange”); | @y 에 apple と orange 를 순서대로 대입 (문자열) |
@z = ($a, $b, $c); | @z 에 $a, $b, $c 를 순서대로 대입 (변수) |
변수로 구성된 리스트에 값을 대입할 수 있습니다.
구문열 | 내용 |
($x, $y, $z) = (1, 2, 3); | $x, $y, $z 에 각각 1, 2, 3 을 대입 |
($a, $b) = (“banana”, “melon”); | $a 에 banana 를、$b 에 melon 을 대입 |
($a, $b) = ($b, $a); | $a 과 $b 의 값을 교체 |
배열 안의 각 요소는 $배열명[인덱스]라는 형식으로 표현할 수 있습니다.
배열의 인덱스는 0부터 시작합니다.
따라서 배열의 1번째부터 3번째 요소에 접근하려면은, 0부터 2까지를 인텍스로 사용해야 됩니다.
다음의 표의 패던 1과 패턴 2는 동일한 내용입니다.
패턴 1 | @fruit = (“apple”, “orange”, “banana”); |
패턴 2 | $fruit[0] = “apple”; |
$fruit[1] = “orange”; | |
$fruit[2] = “banana”; |
배열의 각 요소에는 인덱스를 지정하는 것으로 다음과 같이 접근할 수 있습니다.
@fruit = ("apple", "orange", "banana");
print "$fruit[1]";
> orange
배열의 마지막을 다음과 같은 방법으로도 출력할 수 있습니다.
@fruit = ("apple", "orange", "banana");
print "$fruit[$#fruit]";
> banana
배열의 요소 개수는 다음과 같은 방법으로 취득할 수 있습니다.
@fruit = ("apple", "orange", "banana");
# 배열의 갯수
$num = @fruit;
print "배열의 요소는 $num개 있습니다.";
> 배열의 요소는 3개 있습니다.
배열에 요소를 추가하는 방법은 다음과 같습니다.
@fruit = ("apple", "orange", "banana");
# 배열의 마지막에 요소를 추가
@fruit = (@fruit, "grape");
print @fruit;
> apple orange banana grape
배열 함수
배열을 조작하기 위한 함수로 다음과 같은 함수가 있습니다.
함수 | 내용 |
push | 배열의 마지막에 요소를 추가 |
pop | 배열의 마지막 요소를 삭제 |
unshift | 배열의 맨 앞에 요소를 추가 |
shift | 배열의 맨 앞 요소를 삭제 |
reverse | 배열의 순서를 역순으로 정렬 |
sort | 배열의 순서를 정렬 |
push
배열의 마지막에 요소를 추가
@char = ("A", "B", "C");
push(@char, "D");
print @char;
> ABCD
pop
배열의 마지막 요소를 삭제
@char = ("A", "B", "C");
pop(@char);
print @char;
> AB
unshift
배열의 맨 앞에 요소를 추가
@char = ("A", "B", "C");
unshift(@char, "D");
print @char;
> DABC
shift
배열의 맨 앞 요소를 삭제
@char = ("A", "B", "C");
shift(@char);
print @char;
> BC
정렬
reverse
배열의 순서를 역순으로 정렬
@char = ("A", "B", "C");
@char = reverse(@char);
print @char;
> CBA
sort
정렬에는 다음과 같이 4가지의 패던이 존재합니다.
문자열 정렬(오름차순)
@char = ("C", "A", "D", "B");
@char = sort(@char);
print @char;
> ABCD
문자열 정렬(내림차순)
@char = ("C", "A", "D", "B");
@char = sort { $b cmp $a } @char;
print @char;
> DCBA
숫자 정렬(오름차순)
@char = (3, 1, 4, 2);
@char = sort { $a <=> $b } @char;
print @char;
> 1234
숫자 정렬(내림차순)
@char = (3, 1, 4, 2);
@char = sort { $b <=> $a } @char;
print @char;
> 4321
쿼터 문자
리스트를 기술할 때 간편한 방법으로 [단어의 쿼터 문자]가 있습니다.
이 구문을 사용하면 괄호 안에 있는 공백 이외의 부분이 리스트로 생성됩니다.
예를 들어 다음과 같은 방법으로 기술한 배열이 있습니다.
@week = ('Sun', 'Mon', 'Tue', 'Wed');
이것을 쿼터 문자를 사용하면 다음과 같습니다.
@week = qw(Sun Mon Tue Wed);
각 요소 간의 공백 이외에도 탭이나 개행으로 구분을 해도 사용할 수 있습니다.
@week = qw(Sun
Mon
Tue
Wed
);
참고로 쿼터 구문의 경우, 위와 같이 () 가 아닌 다른 기호( !, /, #, { }, [ ] 등)를 사용해도 괜찮습니다.
@week = qw!Sun Mon Tue Wed!;
배열 자르기
배열 자르기 란 배열에서 특정 위치의 요소에 접근하는 방법입니다.
예를 들어 다음과 같은 배열이 있습니다.
@name = qw(mike fred perl peter);
1번째 요소와 2번째 요소에 접근하기 위해서는 인덱스를 사용해서 다음과 같이 접근할 수 있습니다.
($name[0],$name[1]);
배열 자르기를 사용하면 다음과 같이 사용할 수 있습니다.
@name[0, 1];
자르기의 경우는 $가 아닌 @를 사용합니다.
그리고 하나의 요소에 대해 조작하는 것이 아닌 배열의 부분집합으로부터
배열 변수를 작성하는 조작입니다.
코드 예 -1 (임의의 요소를 취득)
@name = qw(mike fred perl peter tom);
print @name[1,3]; # 2번째와 4번째 요소를 출력합니다.
> fred peter
코드 예 -2 (임의의 요소를 교체)
@name = qw(mike fred perl peter tom);
@name[0,1] = @name[1,0]; # 1번째와 2번째 요소를 교체합니다.
print @name;
> fred mike perl peter tom
코드 예 -3 (임의의 요소로 교체)
@name = qw(mike fred perl peter tom);
@name[0,1,2] = @name[1,1,1]; # 1번째부터 3번째까지의 요소를 2번째 요소를 교체합니다.
print @name;
> fred fred fred peter tom
코트예 -4 (임의의 요소를 변경)
@name = qw(mike fred perl peter tom);
@name[2,3] = qw(joe lee); # 2번째 3번째 요소를 변경합니다.
print @name;
> mike fred joe lee tom
다차원 배열
배열은 다차원 사용이 가능합니다.
사용법은 배열 안에 배열을 만들어 주는 것으로 간단하게 만들 수 있습니다.
@list = (
['a', 'b', 'c'],
['d', 'e', 'f'],
['g', 'h', 'i'],
);
2행의 [‘a’, ‘b’, ‘c’]가 1번째 요소가 되며 그 안에 (‘a’, ‘b’, ‘c’)라는 배열이 정의되었습니다.
이처럼, 배열을 대괄호로 정의하는 것을 리퍼 런스라고 합니다.
위에 @list에서 대괄호 1행 전부가 스칼라(문자열)이라고 이해하시면 조금 더 도움이 될 거라 생각됩니다.
하지만 스칼라라고 하지만 실체는 배열입니다.
배열은 @list에 1행 요소에 그리고 그 안의 1번째 요소인 [a]에 접근하는 방법으로는 인덱스를 사용합니다.
@list = (
['a', 'b', 'c'],
['d', 'e', 'f'],
['g', 'h', 'i'],
);
print $list[0][0];
> a
리퍼 런스를 사용해서 1번째 요소(배열)에 접근하는 방법으로는 다음과 같습니다.
@list = (
['a', 'b', 'c'],
['d', 'e', 'f'],
['g', 'h', 'i'],
);
print @{list[0]};
요소를 모두 출력(배열 단위로) 하는 방법은 다음과 같습니다.
@list = (
['a', 'b', 'c'],
['d', 'e', 'f'],
['g', 'h', 'i'],
);
foreach $tmp (@list) {
print "@{$tmp}\n";
}
> a b c
> d e f
> g h i
요소를 모두 출력(요소 단위로) 하는 방법은 다음과 같습니다.
@list = (
['a', 'b', 'c'],
['d', 'e', 'f'],
['g', 'h', 'i'],
);
foreach $tmp1 (@list) {
foreach $tmp2 (@{$tmp1}) {
print "$tmp2 \n";
}
}
> a
> b
> c
> d
> e
> f
> g
> h
> i
@list에 요소를 추가하는 방법은 다음과 같습니다.
@list = (
['a', 'b', 'c'],
['d', 'e', 'f'],
['g', 'h', 'i'],
);
# 배열의 마지막에 배열을 추가
push(@list, ['j','k','l']);
print @{$list[3]};
> jkl
특정 요소에 안에 요소를 추가하는 방법은 다음과 같습니다.
@list = (
['a', 'b', 'c'],
['d', 'e', 'f'],
['g', 'h', 'i'],
);
# 1번째 요소에 요소를 추가
push(@{$list[0]}, 'x');
print @{$list[0]};
> abcx
댓글