# 자료형

| 타입  | 기호  |
| --- | --- |
| 스칼라 | \$  |
| 배열  | @   |
| 해시  | %   |

## 스칼라 (Scalar)

스칼라는 숫자나 문자열 같은 단순한 변수형입니다. 스칼라 타입의 변수는 `$`로 시작합니다. 변수의 주소를 담는 참조의 경우에도 스칼라 타입입니다.

### 숫자

```perl
$num1 = -100;
$num2 = 108.32;
$num3 = 0xff;
$num4 = 3.14E7;
$num5 = 123_456_789; # 큰 숫자의 경우 3자리마다 '_'를 넣어서 읽기 쉽게 할 수 있습니다.
```

#### 수학 함수

- abs
- atan2
- cos
- exp
- hex
- int
- log
- oct
- rand
- sin
- sqrt
- srand

### 문자열

문자열은 홑따옴표('') 또는 쌍따옴표("")로 묶습니다. 쌍 따옴표로 묶인 문자열의 경우에는 문자열 내에 포함된 변수를 보간 처리(interpolation)하지만, 홑 따옴표의 경우에는 처리하지 않습니다.

```perl
$name = 'charlie';
$age = 14;
$str1 = "\u$name is $age-year-old.\n";
$str2 = '\u$name is $age-year-old.\n';

print $str1; # Charlie is 14-year-old.
print $str2; # \u$name is $age-year-old.\n
```

`q//`는 홑 따옴표처럼, 그리고 `qq//`는 쌍 따옴표처럼 작동합니다. 문자열에 따옴표가 포함된 경우에 유용합니다. `//` 대신 `()`등을 사용할 수있습니다.

```perl
$str = qq/"How are you?"/;
```

#### 이스케잎 문자열 (Escape sequence)

| 이스케잎 문자 |     |
| --- | --- |
| `\\` | 역슬래시 |
| `\'`, `\"` | 따옴표 |
| `\n`, `\r`, `\t` | 줄바꿈과 탭 |
| `\xnn` | 16진수 형식의 숫자 |
| `\u` | 다음 문자를 대문자로 만듭니다. |
| `\l` | 다음 문자를 소문자로 만듭니다. |
| `\U`, `\L` | 이어지는 모든 문자를 대문자/소문자로 만듭니다. |
| `\Q` | 이어지는 모든 문자 중 영문자/숫자가 아닌 문자를 역슬래시 처리합니다. |
| `\E` | `\U`, `\L`, `\Q`를 끝냅니다. |

#### 히어독 (Here doc)

히어독은 문자열의 길이가 긴 경우에 유용하게 사용됩니다. 히어독은 `<<식별자`로 시작하고 `식별자`로 끝납니다.

```perl
$name = 'Charlie';
$age = 14;

$var = <<MYDOC;
$name is $age-year-old.
MYDOC

print $var;

$var = <<"MYDOC"; # 쌍따옴표로 묶은 것은 따옴표로 묶지 않은 것과 같습니다.
$name is $age-year-old.
MYDOC

print $var;

$var = <<'MYDOC'; # 이렇게하면 보간 처리가 되지 않습니다.
$name is $age-year-old.
MYDOC

print $var;
```

#### V-문자열

V-문자열은 v로 시작하며, 문자 코드를 .으로 구분하여 표기합니다.

```perl
$char = v9786;
print "$char\n"; # ☺

$str = v102.111.111;
print "$str\n"; # foo
```

#### 특수 리터럴

다음 특수 리터럴은 `$`도 붙지 않으며, 문자열 보간에는 사용될 수 없습니다. 사실 변수가 아니라 함수입니다.

- `__FILE__`

  현재 스크립트 파일 이름

- `__LINE__`

  현재 줄 번호

- `__PACKAGE__`

  현재 패키지 이름


```perl
print "Line: ".__LINE__."\n";
```

#### 문자열 함수

- length(STRING)

  문자열의 길이

- lc(STRING), lcfirst(STRING)

  소문자로 변환

- uc(STRING), ucfirst(STRING)

  대문자로 변환

- index(STRING, SUBSTR)

  부분 문자열의 위치

- rindex(STRING, SUBSTR)

  index()와 마찬가지로 부분 문자열의 위치를 반환합니다만, 문자열의 끝에서부터 탐색합니다.

- substr(STRING, OFFSET)

  부분 문자열을 반환합니다.

- substr(STRING, OFFSET, LENGTH)

- substr(STRING, OFFSET, LENGTH, NEW_STR)

  부분 문자열이 반환되며, 원본 문자열 중 해당 부분이 새로운 문자열로 대체됩니다.

- chr(NUMBER)

  아스키 코드 또는 유니코드를 문자로 변환합니다.

- crypt(STRING, SALT)

  비밀번호 등의 단방향 암호화에 사용됩니다.

- hex(STRING)

  16진수 문자를 변환합니다.

- ord(STRING)

  문자열의 첫 번째 문자를 숫자로 변환합니다.

- reverse(STRING)

  문자열을 뒤집습니다.

- sprintf(FORMAT_STR, VAR)

  C 스타일의 형식화 문자열 함수입니다.

- chop(STRING)

  문자열에서 마지막 문자를 제거합니다. 매개변수가 생략된 경우에는 `$_`에 대해서 실행됩니다. 매개변수가 리스트인 경우에는 모든 아이템에 대해서 실행됩니다.

- chomp(STRING)

  chop()과 비슷하지만, 문자열에서 마지막 줄바꿈 문자를 제거합니다.


## 리스트

괄호 사이에 스칼라 값을 콤마로 구분하여 나열한 것을 리스트라고 부릅니다. 리스트를 배열 변수에 대입하면 배열이 되고, 해시 변수에 대입하면 해시가 됩니다.

## 배열 (Array)

배열은 0부터 시작되는 숫자 인덱스를 사용하는 순서화된 리스트입니다. 배열 타입의 변수는 `@`로 시작합니다. 배열의 아이템은 스칼라 타입이므로 배열의 아이템을 참조할 때에는 변수명 앞에 `$`를 사용하고, 배열의 인덱스는 `[]`로 명시합니다.

```perl
@names = ('Charlie', 'Steve', 'Jane');

print "$names[0]\n";
```

## 해시 (Hash)

해시는 키/값 형식의 순서없는 자료형으로 연관 배열이라고도 불립니다. 해시 타입의 변수는 `%`로 시작합니다. 해시의 아이템을 참조할 때에는 변수명 앞에 `$`를 사용하며, 데이터의 키는 `{}`를 사용해서 명시합니다.

```perl
%persons = ('Charlie', 14, 'Steve', 37, 'Jane', 22);

print "Age is $persons{'Charlie'}\n";
```