Monday, December 31, 2012

Perl 의 shift 와 unshift 함수

shift 는 array의 맨 앞에서 element 를 빼내고 (stack 의 pop 에 해당)
unshift 는 array의 맨 앞에 element 를 넣는다 (stack 의 push 에 해당).

Perl에서 두 array 를 합치는 법

 my @a = (1, 3, 5, 7);  
 my @b = (2, 4, 6, 8);  
 my @c = (@a, @b);  
 print(join(", ", @c) . "\n");  
키워드 : 합침, union

array 를 hexadecimal 의 string 으로 받는 함수

1:  sub atohexstring  
2:  {   
3:         my $s = "";  
4:         foreach(@_){  
5:                $s .= tohex($_) . " ";  
6:         }  
7:         chop($s);  
8:         return $s;   
9:  }  
다음과 같이 쓰면 됨.
 my @a = hexarray("A0 A1 A2 FF FE FD");  
 print("@ " . atohexstring(@a) . "\n");  

byte의 array를 string으로 'serialize' 하는 법

1:  sub TESTserializeArray  
2:  {  
3:       my @a = hexarray("A0 A1 A2 FF FE FD");  
4:       my $s = serializeArray(@a);  
5:       print(stohex($s) . "\n");  
6:  }  
7:  sub serializeArray   
8:  {  
9:       my $s = "";  
10:       foreach(@_){  
11:            $s .= pack('C1', $_);       
12:       }  
13:       return $s;  
14:  }  
Perl 에서 binary file 등을 다룰 때는 byte의 연속을 string 으로 보고 작업하므로 이 함수는 유용하다.

string 을 바이트 단위의 hexadecimal 로 얻어내는 Perl 함수

이것은 'serialize' 된 데이터를 hexadecimal 값으로 보는데 유용한 함수이다.
1:  sub TESTstohex  
2:  {  
3:         my $s = "";  
4:         $s .= pack('C1', 255);  
5:         $s .= pack('C1', 254);  
6:         my $h = stohex($s);  
7:         print($h);  
8:  }  
9:  sub stohex  
10:  {  
11:         my $s = $_[0];  
12:         my $result = "";  
13:         my @a = unpack('(C1)*', $s);  
14:         foreach(@a){  
15:                $result .= tohex($_) . " ";  
16:         }  
17:         chop($result);  
18:         return $result;  
19:  }  
4행에서 pack 함수를 쓰지 않으면 255 의 숫자 2, 5, 5가 각자 하나씩의 문자가 되어 들어가버린다.

Perl에서 bit shifting 하기

 my $n = 0b1111;  
 print("$n\n");  
 $n >>= 2;  
 print("$n\n");  
   
 my $m = 0xFF;  
 print("$m\n");  
키워드 : binary, 2진수, 16진수

Object Oriented Programming in Perl

Object Oriented Programming in PERL
Perl Object Oriented Meta-Tutorial
키워드 : OOP, package, separate files

Perl 에서 max min function 쓰는 법

max(), min() 함수를 쓰려면 다음과 같이 먼저 로딩을 해야 한다.
 use List::Util qw[min max];  
 print(min(4,6) . "\n");  
 print(max(1, 2, 3, 4, 5, 6) . "\n");  
 print(max(666) . "\n");  
출처 : Min and max functions in Perl

Sunday, December 30, 2012

hexadecimal 의 array 를 string 으로 얻어내는 Perl 함수

 my @a = hexarray("EF F0 00 0F 01 02");  
 my $s = tohexs(@a);  
 print("$s\n");  
   
 sub tohexs  
 {  
      my $s = "";  
      foreach(@_){  
           $s .= sprintf("%02X ",$_);  
      }  
      chop($s);  
      return $s;  
 }  
   
 sub hexarray   
 {   
      my @s_ = split(/ /, $_[0]);   
      my @a = ();   
      foreach(@s_){   
           push(@a, hex($_));   
      }   
      return @a;      
 }  
tohexs 는 tohexstring 의 줄임.

Perl 에서 array 와 string 사이의 변환

array 를 string 으로 변환해주는 Perl 함수
 sub atos  
 {  
      my $s = join(", ", @_);  
      return $s;  
 }  
다음과 같이 쓰면 array 를 간편히 print 해주기 쉽다.
 my @a = (10, 20, 30, 40);  
 print(atos(@a)."\n");  
string 을 array 로 변환해주는 Perl 함수
 sub stoa  
 {  
      return split(//, $_[0]);  
 }  
Perl에서 string의 문자 하나하나를 다루는 법 참조
키워드 : print array, Perl 에서 array 를 print 해주기

Perl 에서 integer 를 hexadecimal 로 바꿔주는 함수

다음 함수는 decimal 을 hexadecimal 로 변환해준다.
 sub tohex  
 {  
      my $s = sprintf("%X",$_[0]);  
      if(length($s) % 2 == 1){  
           $s = "0" . $s;  
      }  
      return $s;  
 }  
사용법은 다음과 같다.
 print(tohex(254)."\n");  
결과 : 254의 16진수 표기인 FE 가 찍힌다.

8비트 integer 를 두자리 hexadecimal 로 바꿔주는 목적만이라면 다음과 같이 해도 된다.
 sub tohex  
 {  
      sprintf("%02X",$_[0]);  
 }  

hexadecimal string 을 integer array 로 만들어주는 Perl 함수

 sub hexarray
 {  
      my @s_ = split(/ /, $_[0]);  
      my @a = ();  
      foreach(@s_){  
           push(@a, hex($_));  
      }  
      return @a;       
 }  
다음과 같이 사용한다.
 my $s = "FF FE 0A 10";  
 my @a = hexarray($s);  
 print(join(",",@a) . "\n");
결과는 255,254,10,16 와 같이 나온다.
키워드 : 16진수

Saturday, December 29, 2012

Perl 에서 array of arrays 를 다루는 방법

1:  my @aa = ();  
2:  my @a = ("Mega", "Giga", "Tera");  
3:  my @b = ("Centi", "Milli", "Nano");  
4:  push(@aa, \@a);  
5:  push(@aa, \@b);  
6:  foreach(@aa){  
7:         foreach(@$_){  
8:                print();  
9:                print(" ");  
10:         }  
11:         print(" -> First Element is $_->[0]");  
12:         print("\n");  
13:  }  

Perl 에서 array 를 function 의 argument 로 넘기는 방법

1:  my @a = (90, 100, 200, 300, 400);  
2:  printAll(\@a);  
3:    
4:  my $i = 1;  
5:  print("Print one by one : ");  
6:  printAndInc(\@a, \$i);  
7:  printAndInc(\@a, \$i);  
8:  printAndInc(\@a, \$i);  
9:  print("\n");  
10:    
11:  sub printAndInc  
12:  {  
13:       my ($pa, $i) = @_;  
14:       print("$pa->[$$i] ");  
15:       $$i++;  
16:  }  
17:    
18:  sub printAll  
19:  {  
20:       my ($pa) = @_;  
21:       my $result = join(" ", @$pa);  
22:       print("Print all : $result\n");  
23:  }  
13행에서 my (@a, $i) = @_;  와 같이 array 로 받으면 제대로 작동하지 않는다.
키워드 : 함수, parameter

Perl 의 array

perl - array variables

OS X terminal 에서 화면 깨끗이 clear 하기

Command + K 하면 된다.
clear 명령을 쓰면 기존의 명령어는 스크롤해 올라가면 그냥 위쪽에 남아 있다.
키워드 : 터미널

printf 에서 0의 개수를 채워주는 방법

0의 개수를 채워주는 format string의 형태는 %0[숫자]X, %0[숫자]d 처럼 하면 된다. 예를 들어 바이트를 hexadecimal 로 출력할때 0F, 0A 처럼 두자리로 포맷해주려면 다음과 같이 하면 된다.
 sprintf("%02X ",$_);  
키워드 : Perl
레퍼런스 : http://www.cprogramming.com/tutorial/printf-format-strings.html

Perl 에서 decimal 과 hexadecimal 사이의 변환

Decimal → Hexadecimal
 print(tohex(254));
 sub tohex  
 {  
      my $s = sprintf("%X",$_[0]);  
      if(length($s) % 2 == 1){  
           $s = "0" . $s;  
      }  
      return $s;  
 }  
출처 : Perl 에서 integer 를 hexadecimal 로 바꿔주는 함수
Hexadecimal → Decimal
 print(hex("FF"));
레퍼런스 : how to convert decimal to hexadecimal in perl
키워드 : 10진수, 16진수, 십진수