Perl 리스트와 배열 사용 방법 예제

 리스트와 배열 

리스트 란 스칼라에 순서를 붙여서 나열한 것으로, 리스트 안에서 스칼라 위치에 따라 자유롭게 접근할 수 있습니다.

그리고 그 리스트를 변수로 한 것을 배열이라고 합니다.

 

※리스트는 [데이터] 배열은 [변수]를 의미합니다.

배열 이름은 @(앳) + 영문자로 시작하며 그 이후는 숫자 영문자 그리고 언더파(_)를 사용할 수 있습니다.

그리고 대문자 소문자를 구별합니다.

@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

댓글