레이블이 Perl인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Perl인 게시물을 표시합니다. 모든 게시물 표시

2013년 9월 11일 수요일

Perl 제대로배우기 - 15장(Other Data Conversion)

15. Other Data Conversion
서브문자열 찾기
$x = index($string,$substring);
반환값 $x는 0 부터 시작 , 찾을 수 없으면 -1
join 함수는 배열을 분리자로 합쳐진 단일 문자열로 표현하기
$join_str = join(“ “,@array);


$x = index($bigstring,$littlestring,$skip);
$skip : 시작 index


rindex :: 오른쪽으로부터 탐색 한다. 반환값은 index와 동일하다.


서브문자열의 추출과 대체
$s = substr($string,$start,$length);


sprintf()로 테이터 포맷팅하기
$result = sprintf(“X%05d”,$y);


고급정렬
sub by_number{
 if($a < $b){
   return -1;
 } elsif($a == $b){
   return 0;
 } elsif($a > $b){
   return 1;
 }
}
이름이 중요하다 by_number..
사용예)
@by_numbers = sort by_number @sorted_arrays;
우주선 연산자 (spaceship) :: <=>
@by_spaceships = sort { $a<=>$b} @sorted_arrays;
여기서 반드시 변수는 $a 와 $b 이어야 한다!!
문자열 비교 연산자 :: cmp
@rst = sort { ($a<=>$b) || ($a cmp $b)} @sorted_arrays;
** 해시는 추후 정리 합니다.
변환
tr/ab/ba/cds;
c - complement 비문자
d - delete , 삭제 즉 대응문자가 없으면 제거함.
s - 하나로 압축 된다.
의미는 a는 b로 변환하고 b는 a로 변환한다. 현재 변수 $_;
반환값은 변환된 문자수

$name =~ tr/xxx/xxx/; 처럼 =~ 연산자를 사용할 수 있다.

Perl 제대로배우기 - 16장(System Database Access)

16. System Database Access
패스워드와 그룹 정보를 알아내기
/etc/passwd 파일 구조
account:password:UID:GID:GECOS:directory:shell
예)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
각 필드 설명
필드
실제 값
설명
account
shutdown
root
해당 로그인 계정 명
passwd
x
암호된 패스워드
UID
6
사용자 ID  (User ID)
root - 0, 기타 사용자  - 0 이 아닌  정수
GID
0
로그인 Group (Group ID)
GECOS
/sbin
선택적인 필드, 추가 정보를 위한 목적으로 사용된다.
GECOS = General Electric Comprehensive Operating System
주석
directory
/sbin
사용자 홈 디렉토리 ($HOME)
shell
/sbin/shutdown
로그인 쉘 (만약 빈칸이면 /bin/sh)


정보를 읽은 함수들
  • getpwuid :: UID를 사용하여 passwd 필드 정보를 얻는 함수
  • getpwnam :: 사용자명을 사용하여 passwd 필드 정보를 얻음.
  • getpwent :: 순차적으로 passwd 필드 목록을 얻는다.
    • setpwent :: getpwent에 사용시 초기화 한다.
    • endpwent :: getpwent에 사용후 자원 해지한다.


예)
($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) = getpwnam or getpwuid ,getpwent
passwd 파일 필드보다 많다.
^^ 리눅스에서
setpwent();
while(@list = getpwent()){
  ($login,$home) = @list[0,7];
}
endpwent();


/etc/group 파일 관련 정보
정보 구조 :: group_name:passwd:GID:user_list
예)
root:x:0:root
sys:x:3:root,bin,adm
각 필드 설명
필드
실제 값
설명
group_name
sys
the name of the group
passwd
x
group passwd, 만약 빈란이며 passwd는 필요하지 않는다.
GID
3
group ID
user_list
root,bin,adm
group에 포함된 사용자명


정보 읽는 함수
  • getgrgid :: GID를 사용하여 group 정보를 읽는다.
  • getgrnam :: 그룹명을 사용하여 group 정보를 얻는다.
  • getgrent :: 그룹정보를 순차적으로 얻는다.
    • setgrent :: 초기화
    • endgrent :: 자원해제



이진테이터를 묶거나 풀기
pack 함수 :: 일반값을 --> 이진테이터 형태로 변환
unpack 함수  :: pack의 반대 함수
포맷 문자열에 대한 설명은 TEMPLATE를 참고 하라
좀더 알고 싶다면 강좌
예제)
#!/usr/bin/perl
use strict; use warnings;


####################################################
## 문자열을 배열로 변환
#
my $s = "MP3 Player"; # 문자열 정의


# 문자열을 1글자씩 분해하여 배열로 만들기
my @array = unpack "C*", $s;


# 배열 내용 출력 (1글자씩 나옴)
print chr($_), "-" foreach (@array);
# 화면 출력 결과: M-P-3- -P-l-a-y-e-r-
print "\n\n"; # 편의상 줄바꿈


####################################################
## 배열을 문자열로 변환
#
my $result = pack "C*", @array;


# 문자열 출력
print $result, "\n";
# 화면 출력 결과: MP3 Player
# 다시 복원되었습니다.



네트워크 정보 얻어내기
gethostbyname :: 네트워크 이름을 통해서 ip 주소를 변환 한다.
리턴형 :: 스칼라 변수를 형이 아닐때
($name,$aliaes,$addrtype,$length,@addrs) = gethostbyname($name); #일반적인 형태
변수 설명 (man gethostbyname 함수에서 hostent 참고)
  • $name :: official name of host
  • $aliaes :: 별칭
  • $addrtype ::  host address type (AF_INT 혹은 AF_INET6)
  • $legth ::  addrs의 bytes 길이
  • @addrs :: network address  , 4개 문자 혹은 6개 문자로 되어 있다.
#!/usr/bin/perl -w
$hostname = "issacnet.cafe24.com";
($name,$alias,$addrtype,$length,@addrs) = gethostbyname($hostname);
$ipaddr = join(".",unpack("C4",$addrs[0]));
print <<END_OF;
\$name    =$name
\$alias   =$alias
\$addrtype=$addrtype
\$length  =$length
\@addrs   =$ipaddr
END_OF


스칼라 변수 일때는 첫번째 주소만을 리턴한다.
$ipaddr = gethostbyname($hostname);
$ipstr = join(".",unpack("C4",$ipaddr));
print "$hostname is $ipstr\n";

Perl 제대로배우기 - 14장(Process Management)

14. Process Management
system과 exec 사용하기
새로운 프로세스 가장 간단한 방법 : system 함수 사용
예) system(“date”);
system의 리턴형은 0 이면 정상 0 이 아니면 비정상 종료를 의미 한다. 그 이유는 쉘명령 결과 값을 리턴하기 때문이다.
** 자식 프로세스는 부모로 부터 현재 umask,현재 디렉토리,사용자ID
%ENV를 사용하여 환경 변수를 읽거나 변경할수 있다.
foreach $key(sort keys %ENV){
  print “$key = $ENV{$key}\n”;
}


local 연산자 이용하여 임시적으로 환경 변수를 변경하기
{
 local $ENV{“PATH”} = “/bin:/usr/bin:/usr/ucb”;
 system “grep fred bedrock >output”;
}
@cfiles = (“fred.c”,”barney.c”);
@options = (“-DHARD”,”-DGRANTE”);
system “gcc -o slate @options @cfiles”;
system “gcc”,”-o”,”slate”,@options,@cfiles;


역인용부호의 사용
backquote 사용하는 방법
완료를 기다리며, 표준 출력을 사용한다.
$now = “the time is now”.`date`;


foreach $_ (`who`){
  ($who,$where,$when) = /(\S+)\s+(\S+)\s+(.*)/;
  print “$who on $where at $when\n”;
}
2>&1  :  표준에러를 표준출력으로 합친다.
die “rm who_out*” if `rm who_out* 2>&1`;


파일핸들로서 프로세스 사용하기
C라이브러 popen(3) 처럼 파일핸들을 사용하여 프로세스를 생성하기
open(WHO,”who|”);
open(LPR,”|lpr -Pslatewriter”);
while(<WHO>){
  unless (/fred/){
     print LPR $_;
  }
}
close WHO;
close LPR:


fork 사용하기
fork 함수를 사용함.
if(!defined($child_pid = fork())){
 die “can’t fork : $!”;
} elsif ($child_pid){
 print “부모";
} else {
 print “자식";
}
프로세스 연산의 요약
시그널을 보내고 받기