@array[1] 과 (@array)[1] 의 차이. (perl)

kevin0960의 이미지

왜 전자는 안되고 후자가 되는 것일까요... ? Perl 을 처음 배우는데 이해가 잘 안가네요.

aero의 이미지

Perl 5는 최종적으로 얻어지는게 무엇이냐를 기준으로 sigil($,@,% 같은 것)을 붙입니다.
(Perl 6에서는 바뀌지만....)

my @array = (3,4,5);

에서 @array는 배열이고 이 배열의 첫번째 요소는
$array[0] 으로 나타내죠 앞에 스칼라를 나타내는 sigil이 붙은 이유는
그 값이 스칼라 값을 나타내기 때문입니다.

그런데 Perl에서는 배열 슬라이스(array slice)란 문법이 있습니다.
만약에 @array의 첫번째,세번째 요소를 한꺼번에 뽑아내고 싶으면

my @array2 = @array[0,2];

라고 하면 @array2 에는 3,5 가 들어가게 됩니다. 위에서 @array[0,2]에서
앞에 $대신 @가 붙은 이유는 제가 제일 처음 말했던 규칙을 떠올리면 이해가
가실 겁니다.

따라서 @array[0]은 첫번째 요소만을 배열 슬라이스 문법으로 나타낸 것입니다.

my $a = $array[0]; 은 my $a = 3; 처럼 해석되고

my $a = @array[0]; 은 my $a = (3); 처럼 해석됩니다.

결국 저런 경우 같은 결과를 얻지만 배열의 한 요소를 나타낼때는 슬라이스 문법을
사용할 필요가 없습니다. 오히려 혼돈만 주지요.

두번째
(@array)[0] 은 리스트 슬라이스 문법이라는 것을 우선 알아야 합니다.
Perl에서 리스트란 어떤 데이터들을 ,연산자로 연속적으로 나열한 것일 뿐입니다.
언어마다 배열과 리스트가 같은 개념으로 혼용되어 쓰이는 경우가 있는데
Perl에서 배열과 리스트는 명백히 다릅니다.
참고: http://www.perlfoundation.org/perl5/index.cgi?array_vs_list

리스트 예) 1,2,3,4

여기서 ,연산자는 연산자 우선순위가 다른 연산자에 비해 낮을 경우가 많기 때문에
배열에 리스트를 대입하는 경우

my @array = (1,2,3,4); 식으로 리스트가 먼저 구성되도록 ( ) 로 명시적으로 묶어줍니다.

리스트 슬라이스 문법은 다음과 같은 형식입니다.

(리스트)[리스트]

my @a = (1,2,3,4)[0,2,3];

라고 하면 @a에는 1,3,4 가 들어가게 되는거죠

Perl에서는 리스트 컨텍스트(list context)라는 것이 있어서 문맥상으로 리스트가
오기를 기대하는 부분이 있습니다. 이를테면

my @a = HERE;

에서 HERE라는 부분은 리스트 컨텍스트가 됩니다.

(@array)[0] 에서 @array가 있는 부분은 리스트 컨텍스트 입니다.
배열이 리스트 컨텍스트에 오면 배열의 내용이 다 풀려서 리스트처럼
동작을 합니다. 따라서
@array = (3,4,5); 라면
(3,4,5)[0] 처럼 동작해서 결과적으로 3이 되는거죠.

Perl을 제대로 이해하고 사용하려면 리스트가 무엇인지
그리고 리스트 컨텍스트,스칼라 컨텍스트 등 컨텍스트가 무엇인지를
확실하게 이해해야 합니다. Perl을 좀 해봤다고 하는 사람들도
이것을 이해하지 못하고 있는 경우도 많고 이해하지 못하기 때문에
더 이상 발전이 없는 경우를 많이 봅니다.

이것들을 확실히 짚고 넘어가시면 Perl의 새로운 세계가 보이실겁니다.

kevin0960의 이미지

감사합니다.

--------------------------------------
2b or not 2b, that is the question

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.