HaPpY hApPy

Chapter 3 목록과 배열. 본문

Perl 친구따라 강남

Chapter 3 목록과 배열.

juniguya 2012. 11. 7. 20:44

배열의 원소에 접근하는방법은 c와 비슷하다.

$fred[0] = "yabba";
$fred[1] = "dabba":
$fred[2] = "doo";

이렇게 배열을 선언한 후에!
과연
$fred = "nabbo"; #이렇게 될까요? 안될까요?   # 됩니다!! C랑은 또 다른점이네요 @.@

자 그럼 이번에는 위에 배열에서

$fred[1] .= $fred[0]; #이건 뭘까요? 그리고 결과는 어떻게 될까요? # $fred[1]은 이제 "dabbayabba" 가 됩니다.

$rocks[0] = 'bedrock';
$rocks[1] = 'slate';
$rocks[2] = 'lava';
$rocks[99] = 'schist';
   #중간의 3~98은 undef으로 정의됩니다.

$end = $#rocks; //마지막 요소의 첨자 즉 99가 들어갑니다.
$number_of_rocks = $end +1;//요소의 갯수 100이 들어가겠죠.

$rocks[$#rocks] = 'Last rock'; //마지막 요소에 대입
$rocks[-1] = 'Last rock';//마지막 요소에 대입하는 또다른 방법, c랑은 다르군요,,,c에서도 저렇게 되나? ' '; 해본적이 없네;

목록상수.
(1, 2, 3, 4, 5) #1, 2, 3 세 값의 목록
(1, 2, 3, 4, 5,) #위와 마찬가지 마지막,는 무시
(1.7 .. 5.7) # 위와 마찬가지 소수점 무시...음,,그럼 소수점은 이방법으로 못넣는건가? @.@?
("fred", 4.5) #두값 "fred"와 4.5
() # 빈 목록
(1..100) # 정수 1~100까지의 100개의 목록
(0, 2 ..10, 11, 12) #( 0, 2~10, 11, 12)
($n..$m) #변수값을 넣어줘도된다!
("fred", "barney", "betty") # 전형적인 문자열 목록도 가능
qw(fred barney betty)  # qw를 이용하면 ,를 빼도된다.

($fred, $barney, $dino) = ("flintsone", "rubble", undef) #이런식의 대입도 가능하며 심지어
($fred, $barney) = ($barney, $fred) 이런식으로 다른 변수의 도움없이 서로 값의 교환도 가능하다.

@rocks = qw(bedrock slate lava);
@tiny =();
@giant = 1..1e5 #100,000개의 요소를 가진 목록
@stuff =(@giant, undef, @giant); #200,001개의 요소를 가진 목록
$dino = "granite";
@quarry = (@rocks, "crushed rock", @tiny, $dino);
빈 배열의 목록(@tiny) 들어 갔을때 undef으로 치환되지 않습니다. 대신 명시적으로 undef 을 넣은걸 넣을수는 있습니다.

pop 과 push
LIFO 방식,,,아 교수님 생각나는구나 @.@;
여튼.
pop은 배열의 마지막 요소를 빼내고, push는 마지막에 넣는다.
@array = 5 .. 9;
$fred = pop(@array); # $fred에는 9가 들어가고 @array에는 이제 5, 6, 7, 8 만 남는다.
$barney = pop @array ; # $barney 는 8, @array에는 5,6,7
pop @array ;  # 이렇게하면 pop으로 인해 @array에서 7이 빠져나가고 이제 5,6만 남는다, 대입받는 변수가 없어서
단순히 값을 삭제한것 같지만 함수 리턴 값으로 사용가능 (나중에 함수 부분 공부하면 이에대한 내용이 이해가 된다~!) 

push (@array, 0); # 마지막에 0을 대입 (5, 6, 0)
push @array, 8; # 마지막에 8을 대입 (5, 6, 0, 8)
push @array, 1 .. 10; #기존의 4개에 1~10까지 총 14개 됨

shift와 unshift 연산자.
shift 배열의 시작 요소를 빼내고, unshift는 시작 요소에 삽입한다.
아무것도 없는데
$anything = shift(@array); # 하면 undef 이 들어간다.

이메일 주소를 스칼라에 넣을때는
$email  = "fred\@bedrock.edu"; # 혹은
$email = 'fred@bedrock.edu'; #이런식으로 해야된다. 이방법이 더 좋아보인다 ;)

foreach 문
@rocks = qw(bedrock slate lava);
foreach $rock(@rocks)  #각각의 값을 복사해와서 $rock을 이용하는게 아니라 실제 목록 요소 그 자체이다.
{
           $rock ="\t$rock"; #비록 $rock를 바꿨지만 @rocks의 내용이 변경된다
           $rock .="\n";
}
print "The rocks are : \n, @rocks; #각각의요소는 들여쓰기한 상태로 변경된다;

펄이 좋아라 하는 $_ 변수
위의 예제에 $rock를 사용하지않고 펄이 자체적으로 지원해주는 $_를 사용할수도있다.

@rocks = qw(bedrock slate lava);
foreach (@rocks)  #이부분에 $rock을 지우면 이제부터 목록의 요소는 $_에 들어가게된다.
{
           $_ ="\t$_"; #비록 $rock를 바꿨지만 @rocks의 내용이 변경된다
           $_.="\n"; #여기 $_ 다음에 바로 .= 인지 한칸띄우곤지 헷갈린다;;지금 코딩해볼수가 없어서 --;나중에 해봐야겠다.
};

만약 $_에
$_ = "Yabba dabba doo\n"; #을 대입한후에
print; #하면 그냥 $_의 변수의 것이 출력된다.

reverse 연산자.
@fred =6 .. 10;
@barney = reserver(@fred); # 10, 9, 8, 7, 6을 가집니다.
@wilma =  reserver 6 .. 10; #위와 동일한 결과를 가집니다.

@fred = reverse @fred; # 기존의 값을 변경해서 집어넣습니다.

reverse @fred; #만 할경우 뒤집은 값을 어디에도 넣지 않기 때문에 아무것도 하지않는걸 한게됨
(나중에 함수리턴값으론 사용가능)

sort 연산자.
앞                       뒤
구두점<숫자<대문자<소문자<

@rocks =qw(bedrock slate rubble granite);
@sorted = sort(@rocks); #결과로 bedrock, granite, rubble, slate 순으로 들어옵니다.
@backsorted = sort(@sorted); # 다시 결과를 뒤집습니다.
@numbers = sort 97 .. 102; #이걸 솔팅하면 어떻게될까요? 값은 100, 101, 102, 97, 98, 99가 들어갑니다.
sort(@rocks);  #이건 아무것도 하지않는 즉 sort도 reverse와 마찬가지로 뒤집은 값을 어딘가로 넣어줘야한다.
(함수리턴형 아닐시)

스칼라 문맥과 목록 문맥

@people = qw (fred barney betty); # 대입후에.
@sorted = sort @people; # 목록 문맥으로 @people 의 내용이 sorting 되어 들어가고,
$number = 42 + @people; #스칼라 문맥으로 42 + 3 의 결과인 45가 들어간다.
심지어
@list  = @people; #세 사람의 목록
$n = @people; $ 숫자 3

목록과 스칼라 문맥에서의 reverse 연산자

@backwards= reverse qw(yabba dabba doo); # doo, dabba, yabba 3개의 목록이 들어가고
$backwards = reverse qw(yabba dabba doo); # ood,abbadabbay 모든 문자열을 합친다음 뒤집은 결과가 나옵니다.

$fred = something; #스칼라 문맥
@pebbles = something; #목록 문맥 비록 하나일지라도 목록은 목록이다.
($wilma, $betty) = something; #목록
($dino) = something; #아직도 목록 ( ) 때문에 달라진다.

@fred = 6 * 7; #하나의 요소를 가진 목록 (42)를 할당합니다.
@barney = "hello". ' ' . "world";

@wilma = undef #하나의 요소를 가진 목록인 (undef)를 할당한것입니다.
@betty = (); #빈 배열을 만드는 방법;   #배열을 초기화 하는건 () 배열을 만드는게 좋다 undef한다고 초기화 되지 않는다.

강제로 스칼라 캐스팅
@rocks = qw( talc quartz jade obsidian);
print "How many rocks do you have?\n";
print "I have", @rocks, " rocks!\n";  #출력이 I have talc quartz jade obsidian rocks 라고나올것임 (안해봐서 모름;;;추측)
print "I have ", scalar @rocks, " rocks!\n";   #아마 I have 4 rocks 라고 나올듯

@lines = <STDIN>; #목록 문맥에서 표준입력 컨트롤 z, x 혹은 d를 눌려야 멈춘다. 아니면 계속 입력
chomp(@lines); #모든 입력의 줄바꿈 문자를 없애버린다. 즉! 줄바꿈이 없어진다.
위에 두줄을 한줄로 하면
chomp(@lines = <STDIN>);# 이 된다.


'Perl 친구따라 강남' 카테고리의 다른 글

Chapter 2 스칼라 데이터  (0) 2012.11.02
Chapter 1. 시작하며  (0) 2012.11.02