23 번째 수정본 소스 보기 : Perl/변수
마지막으로 [b]
-- Loading page list... --
내용출력
로그인[l]
Diary
[f]
최근변경내역
[r]
페이지목록[i]
횡설수설[2]
게시판[3]
링크
수정할 수 없습니다: Perl/변수 는 읽기 전용 페이지입니다.
== # perl 의 변수 == * scalar ** $변수명 = 값 * array ** @배열변수명 = (값1, 값2, ... ) ** $배열변수명[인덱스] = 값 ** 각 element 는 $array[2] 와 같이 사용 ** $#배열변수명은 배열의 마지막 인덱스, @배열변수명은 원소의 갯수를 나타낸다. (값이 1만큼 차이나니 주의) ** print "@array" 는 원소들을 공백으로 구분해서 출력, print @array 는 구분하지 않고 이어서 출력 * associative array (hash) ** %해쉬변수명 = ( 키1, 값1, 키2, 값2, ... ) ** $해쉬변수명{키} = 값 == # 특수한 스칼라 변수 == * $" - 구획 구분자. print "@array";는 print join($", @array) 한 것과 같다. * $$ - 프로세스ID * $/ - 줄 구분자. `명령어` 연산자가 리스트 구문에서 반환될 때는 출력의 각 라인을 원소로 갖는 리스트를 반환하는데, 이 때 줄을 구분하는 용도로 쓰인다. <파일핸들>을 통해서 변수를 읽을 때도 사용 * $. - <>를 사용하여 읽고 있는 파일의 현재 행 * $? - 명령어 수행의 결과. 자식 프로세스의 반환값 * $! - 시스템 에러 메시지 (예: open FH, "log.txt" or die "$!";) ** [[/에러처리]] 참조 == # Scope == === # global (package) variable === * 그냥 사용하거나, use strict; 에서는 our $var; 또는 use vars qw($var); 등으로 선언 {{{#!vim perl $main::name = "Your Name Here"; $Fred::name = "Fred Flintstone"; $Barney::name = "Barney Rubble"; print "\$name in package main is $name\n"; # 현재 패키지의 $name, 이 경우 $main::name print "\$name in package Fred is $Fred::name\n"; print "\$name in package Barney is $Barney::name\n"; }}} {{{#!vim perl $main::name = "Your Name Here"; $Fred::name = "Fred Flintstone"; $Barney::name = "Barney Rubble"; print "\$name in package main is $name\n"; package Fred; print "\$name in package Fred is $name\n"; package Barney; print "\$name in package Barney is $name\n"; package main; }}} * our와 use vars 프라그마는 스코프가 좀 다르다.. use vars 는 패키지 범위를 넘어가지 않지만 our는 넘어간다. our는 렉시컬 스코프... [http://groups.google.co.kr/group/comp.lang.perl.misc/browse_thread/thread/805880cffd586275?hl=ko# question about "package" and variable scope... - comp.lang.perl.misc | Google 그룹스] * 패키지 이름 부분만 생략하여 "$::foo" 등과 같이 쓸 경우는 main 패키지로 간주한다. ("$main::foo")
=== # lexical variable === my $var; 로 선언 === # runtime scope === local $var; - 해당 블록이 끝날때까지는 서브루틴으로 점프해도 영향을 미친다. lexical 변수는 그렇지 않음 {{{#!vim perl my $x = 10; # Line 5 $_ = "alpha"; { my $x = 20; # 이것은 이 블록 안에서만 local $_ = "beta"; # 이것은 somesub()에까지 영향을 미친다 somesub(); # Line 10 } somesub(); sub somesub { print "\$x is $x\n"; print "\$_ is $_\n"; } }}} {{{ $x is 10 $_ is beta $x is 10 $_ is alpha }}} $/와 같은 특수 변수를 다루는 경우를 제외하면, local을 쓰는 것을 지양하고 my를 쓸 것. 전역 변수를 조작해야 하는 경우가 생긴다면 디자인을 새로 하는 것을 고려해보라고 함
=== # 스코프에 영향을 미치는 것 === * 원문 : [http://www.effectiveperlprogramming.com/blog/48 Know what creates a scope. « The Effective Perler] 요점: * 렉시컬 변수는 그 변수의 스코프 내에서만 접근할 수 있다. * 블록(중괄호를 사용하여 만드는)을 사용하여 스코프를 정의할 수 있다 * 파일도 그 자체로 스코프를 정의한다. * 패키지는 스코프를 정의하지 않는다 (주의) == # Global 변수 보충 == * 원문 : [http://www.effectiveperlprogramming.com/blog/630 Understand “global” variables. | The Effective Perler] 요점: * 패키지 변수는 전체 프로그램 내에서 볼 수 있다. * 패키지 변수는 그 변수가 속한 패키지를 안다면 프로그램 내 어디에서든 접근할 수 있다. 이 변수들은 package global이라 한다. ** 해당 패키지 안에서는 변수명만 써도 되고, 다른 패키지에서 접근할 때는
$패키지이름::변수이름
으로 사용 * 현재 패키지가 무엇이든 간에, $_나 $@ 등 perlvar 문서에 언급되어 있는 Perl의 특수한 변수들은 main:: 패키지 내에 정의된다. 이 변수들은 true global이라 한다. * $a와 $b는 특수한 변수이나, 현재 패키지 내에 정의된다. 이 변수들은 special package global이라 한다. * 출력 파일핸들에 관계된 특수 변수들은 파일핸들마다 각각 유지되며, 그 변수들의 현재값은 현재 디폴트 파일핸들로 설정된 파일핸들에 연관된 값이다. ** 디폴트 파일핸들은 select 함수를 사용하여 지정할 수 있다. == # 기타 & Comments == * 변수의 스코프에 관한 글. 단 90년대 후반에 작성된 글이라서, 최신 버전의 Perl에는 좀 안 맞는 내용도 있다. (예를 들어 파일핸들을 이제는 그냥 my $fh 같이 렉시컬 스칼라변수를 쓰면 된다) ** [http://perl.plover.com/FAQs/Namespaces.html.en Coping with Scoping] ** [http://perl.plover.com/local.html Seven Useful Uses of Local] * 스칼라 변수는 스트링으로 사용될 때와 수로 사용될 때의 값이 각각 별개로 저장되며, [[Perl/Scalar-Util]] 모듈의
dualvar
함수를 사용하여 그 둘을 서로 별개의 값으로 지정할 수 있다. ** [http://www.effectiveperlprogramming.com/blog/1470 Create your own dualvars | The Effective Perler] * 이 페이지에 들어갈 얘기는 아니지 싶지만 일단... 스트링 내의 변수치환과 다른 이스케이프 시퀀스들의 적용 순서에 관한 얘기. 스트링과 정규식에서 좀 다르다. (왜 다르게 했을까-_-? 어쩐지 옛날부터 뭔가 자꾸 예상과 빗나간다 싶었어) ** [http://www.effectiveperlprogramming.com/blog/1496 Understand the order of operations in double quoted contexts | The Effective Perler] * [http://perlmaven.com/package-variables-and-lexical-variables-in-perl Package variables and Lexical variables in Perl]
---- [[컴퓨터분류]]
Perl/변수
페이지로 돌아가기 |
다른 수정본 보기