HaPpY hApPy

Chapter 2 스칼라 데이터 본문

Perl 친구따라 강남

Chapter 2 스칼라 데이터

juniguya 2012. 11. 2. 11:19


Perl에서는 일반적으로 하나의 값을 갖는 것을 스칼라 라고합니다.
(C에서는 int, string, char, double 등 각각의 자료형에 맞는 변수를 선언한 후에  사용하는데 펄은 그냥 저거 하나에 숫자면 숫자,문자면 문자, 문자열이면 문자열 다 들어갑니다. @.@ c에서 자료형 변환하기 대게 짜증났는데 참 편리하군요)

그리고 Perl 내부에는 정수값이 존재하지 않고, 정수 상수를 동등한 값의 부동 소수로 취급을 합니다.

십진수가 아닌 정수 상수
0377           # 8진수 255
0xff            #16진수 255
0b11111111  # 2진수 255 (그러고보니 2진수를 표현해본적은 없내요,, 그냥 c에서 비트연산만 해봤는데;)


펄에서도 C와 같이 % 연산자를 지원합니다. (움하하, if문이 한결 간단해 지겠군요)

작은 따옴표의 문자열 상수.
'fred' # 네 개의 문자
  ''   
# NULL문자
'Don\'t let an apostrophe end this string prematurely!'
# \가 없으면 처음에 don't 란 (나중에 삽질하지말자;;)

'hello
there'   
#hello 줄바꿈 there , 총 11개의 문자

'/\'\\'  
#작은 따옴표와 역 슬러시 즉, '\

문자열 연산자. (이부분 이 좀 헷갈렸다 @.@)
"hello" . " world"     # "helloworld" 와 같다 , 로 해도 마찬가지 차이점이 뭘까?

"fred" * 3    # "fredfredfred" 와 같음 문자열을 상수횟수 만큼 곱해서 출력 @.@;(편한건가? ' ';)
"barney" * (4+1) # 이러면 어떻게 될까요? 5번? 혹은 4번? 아니면,,,에,,에러?   "barneybarneybarneybarneybarney"

"Z" . 5 * 7  # 이건?? #수식 적용후 문자열로 보여줌!  그래서 Z35 (아 이부분은 적응할때까지 C보다 헷갈리는거 같다~)

Perl로 코드를 작성할때 첫줄에
#!/usr/bin/perl
use warnings
; #를 활성화 하자!
use diagnostics; #를 사용하면 경고메세지에 대한 설명을 보여준다 는데,,아직 해볼질 않아서; 그리고 코딩이 끝나면
                             #컴파일 하기전에 지워주는게 속도개선에 도움이 된답니다!

스칼라 변수
$로 시작하고 펄의 식별자가 따라온다.
$Fred , $fred는 다른 스칼라고, $1234 이렇게 숫자는 안된다. $fred1234 는된다

스칼라 내이밍 할때,
$line_length 처름 _ 를 활용해서 각 각의 단어가 명료하게 전달되게끔 할것.초보자에겐 내이밍도 힘들다 ㅠ_ㅠ

스칼라 활당
$fred = 17; 
                    #어떻게 되입될까요?# $fred에 17을 할당
$barney = 'hello';        #궁긍하면 마우스로 뒤에 긁어보세요# $barney 에 다섯 문자로 이루어진 'hello' 문자열 할당
$barney = $fred + 3;      # $barney 에 $fred의 현재값 + 3을 더한 값(20) 을 할당
$barney = $barney *3;  # $barney에 $barney(20) 에 2를 곱한 값(40)을 할당.

위에 출력이 궁금하면 # 뒷부분을 마우스로 긁어보세요.; )

이원 할당
Perl도 c와 마찬가지로 이원 할당이 가능하다네요
$barney *= 3;   # $barney = $barney * 3; 과 같죠.
$str .= " ";  # 공백을 추가해주는 이원 할당입니다. C에서 string +" "; 와 같군요.

print 함수로 출력하기
c어어를 먼저 배웠기에 참 반가운 내용입니다 ; )
print "hellow whistlerhusky!\n";   #잘 보셔야할껀 ()가 없다는것입니다. 넣으면 어떻게 될까요? # 똑,같,습,니,다 @
.@
$meal = "brontosaurus steak";
$barney = "fred ate a $meal";
# $barney는 이제 "fred ate a brontosauru steak" 입니다.
$barney = 'fred ate a' . $meal;  #위와 다른표현이지만 똑같은 결과입니다.

하지만 만약
$meal;  # $meal 에 아무것도 입력하지않고
$barney = "fred ate a $meal"; #어떻게 될까요? # $barney 는 "fred ate a " 가되고 공백도 아닌 빈문자(그냥 하나마자) 

$fred = 'hello';
print "the name is \$fred.\n";  #어떻게 될까요? # \ 때문에 그냥 "the name is $fred"가 출력됩니다.
print 'the name is $fred' ."\n";  #이거는요?  #위와 똑같이 나옵니다.  작은 따옴표에서는 스칼라변수 사용 못합니다
.
자 만약 $what 이라는 변수에 "brontosaurus steak"; 라는 문자가있고
출력으로
"fred ate 3 brontosaurus steaks" 라고 끝에 s를 붙여 출력할려면 어떻게 해야될까요?
print "$whats"; 이렇게 하면 될까요?   # 안됩니다. 스칼라 변수 $whats 의 값이 나올껀데 선언 안했으니 빈문자입니다.
print "$what s 이러면요? # "fred ate 3 brontosaurus steak s" 라고 한칸 띄우고 s가 출력될껍니다.
print "${what}s" 이러면? # 이렇게 하면됩니다~
print "$what"."s"; 이렇게? # 마찬가지로 됩니다~ 위 방법이 더 편하겠죠?

책에 연산자 결합 방향과 우선순위라고 있는데,,,한번 훑어보시면 좋을듯.  P39
(C랑 우선순위 똑같다고 해서 걍 대충 훑어보고 슈슉~, 혹 우선 순위를 기억 못하겠다면 괄호를 적극 사용!( ) )

비교연산자 

 비교  숫자 문자 
 같음  ==  eq
 같지 않음  !=  ne
 작음  <  lt
 큼  >  gt
작거나 같음  <=  le
  크거나 같음  >=  ge
한번 책을 훑어 볼동안 기억나는 단어는 eq 이였는데 - _ -; 약어로 외우면 금방 외우겠네요.
그리고 왠만하면 숫자 기호를 사용하는게 좋을듯,,그래도 혹시나 문자 기호가 있을수도 있으니 외워야될듯 ㅠ_ㅠ

IF
C와는 다르게 무조건 {} 필요

if($name gt 'fred")
{
   #참일경우
}

모든 스칼라 값은 IF문 조건으로 사용가능
조건문 안에서 거짓인 경우는
숫자 0, 빈문자열 ''  작은따옴표 2개를 동시에 붙인거 혹은 큰따옴표 2개 "" 2개, 그리고 undef 가 거짓으로 작동합니다.
공백 문자열' ' 혹은 " " 는 참으로 작동합니다.

if('')
{
	print "참일까요1 ?"; #거짓
}
if(' ')
{
	print "참일까요2 ?"; #참

if("")
{
	print "참일까요3 ?"; #거짓

if(" ")
{
	print "참일까요4 ?"; #참
}

사용자 입력.
$line = <STDIN>; #콘솔에서 사용자로부터 입력을 받아 $line에 대입합니다.

chomp 연산자
이 함수는 변수의 줄바꿈 문자를 없애줍니다.
예를들어 위에 $line = <STDIN> 에 입력으로 "fred"  문자열을 입력할경우
print $line;
print $line;

결과는
fred
fred
  #두줄에 걸쳐 출력되지만
chomp($line = <STDIN>)을 할경우
동일한 조건에 출력은
fredfred #로 한줄에 나옵니다.

undef
숫자로 사용하면 자동으로 0, 문자열로 하면 빈 문자열(거짓) 이됩니다.
이말은 즉 $sum = undef; # undef를 대입하고 갑자기 $sum+=1; 이렇게 해도 됩니다. 왜냐면 undef가 0을 대입하는것 처럼 작동을 이미 했기 때문에 ;)

defined 함수
아,,,ㅡ.,ㅡ 책보다가 저 함수 나왔을때 "저게 뭐하는 함수였찌?" 까먹고는 다시 찾다가 시간낭비 엄청했었는데.
일단 define 함수는 undef가 아니면 모두 참입니다. 만약 undef 면 거짓이 됩니다.

Perl 에서 키보드로 입력받으면 마지막에 EOF가 없지만 파일에서 읽어오면 EOF가 있고 이는 undef과 같이 작동합니다.

그럼 밑에코드는 참일까요, 거짓일까요?
if( defined(0) )
{
  print "실행될까요?"      #실행됩니다 0은 undef 가 아니기 때문에 이 또한 참으로 됩니다.
}
undef 값을 담는 변수를 만들고 싶다면 undef 연산자를 직접 대입해주면 됩니다.

$madonna = undef; #한번도 사용된적 없는듯 만든다.


------------------------------------------
와..2장 정리하는데도 엄청 오래 걸리네요 - _ -;
-------------------------------------------

Nov 2 2012

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

Chapter 3 목록과 배열.  (0) 2012.11.07
Chapter 1. 시작하며  (0) 2012.11.02