펄 프로그램 팁
펄에 관한 간단한 팁을 모아두는 블로그입니다.
[1] 화일이름에 있는 숫자부분만을 이용한 소트(정렬) 여러개의 화일을 처리하는 경우 특정한 부분 가령 이름중의 숫자만을 가지고 정렬(소트)를 하고 싶은 경우가 있습니다.
이때 패턴을 사용하면 아주 간단하게(한줄로) 숫자로 정렬된 화일 리스트를 만들수 있습니다.

sort {($a=~/(\d+)\.js$/)[0] <=> ($b =~ /(\d+)\.js$/)[0]}
$a, $b = 소트(정렬) 특수 변수입니다.( 소트시 자동적으로 앞뒤의 순서값을 치환해 사용합니다)
/(\d+)\.js$/ = 화일명의 뒷부분($)에서 숫자(\d+)만 패턴으로 찾아 패턴변수에 넣습니다.
(\d+)\.js$/)[0] = 패턴 변수에 들어있는 첫번째 값(하나뿐이지만, 배열로 들려주므로)을 이용하라고 지정합니다.

디렉트리에서 .....
[2] opendir3
use strict;
use File::Find;

my %opsrc_hs = ();
my %dlist_hs = ();

open(OUT, ">zzlist.txt");
#open(OUT1, >zzchk-dir-mib.txt); #min-is-black art list

my $spath = "C:\\_data_asp" ;

&listdir("$spath");

my $tmp = <STDIN>;

#die;



sub listdir {
my $spath = shift;

opendir (SDIR, $spath) or die ; #(c .....
[3] opendir2
opendir SDIR, "$sdir" or die("cannot open directory \nError: $!");
#my @files = grep /\.tif$/, readdir SDIR;
#my @files = readdir SDIR;
#

foreach (readdir SDIR){
##foreach (@files){
chomp;
next if $_ !~ /\.tif$/;
next if /^(\.|\.\.)$/;

print "Processing $_\n";
print OUT "Processing $_\n";

print OUT $tif8_chron{substr( .....
[4] opendir
use strict;
use File::Find;

my $xyrunpath = "/usr/app/xyvision/xz";
my $current_path = `pwd`;
chomp $current_path;
my $jobpath = $current_path;
my $outfile = $ARGV[0];

if (!defined($outfile)) {
$outfile = "trawz.bak";
}
#print $outfile;
#print "\n",'Return value of "&f_isjob($current_path)" (1:if JOB, 0:if not): ';
#print &f_isjob .....
[5] iis log file parser # Filename: _iis-log-analisys.pl
# Date: 2005.3.11
# Description:

my $logPath = "";
$logPath = ".";

print $logPath;
print "\nInput logfile name: ";

$logfile = <STDIN>;
$logfile = "ex040713.log";
print $logfile;


print "Reading log file". $logpath .'\\'. $logfile;

my %hex_hs =();

open (TXT, "$logf .....
[6] perl using a "regex file" To simply process a file through a long list of regular expressions, you can do something like this which is simpler than writing a standalone program.





From the command line, run a command like this:



perl -pw regex_file.pl < input_file > output_file



The switches mean:

-p - assume 'while (<>) { ... }' loop around .....
[7] file and directory check and copy from dircetory to new drive
#!/etc/xyvision/common/perl/bin/perl
# description: compare two list one from file and another from directory
#############################################################

use strict;
use File::Find;
use File::Copy;
use File::Path;
use File::Basename;
use Cwd;


# Variable declraration
########################

my %flist_hs = ();
[8] file copy
use strict;
use File::Copy;
use File::Basename;
use Cwd;

my $current_path = cwd();
chomp $current_path;
my $jobpath = $current_path;


my $src = q(C:\Documents and Settings\hchoi\Desktop);
my $des = q(C:\Documents and Settings\hchoi\Desktop);

open LOG, ">error-log.txt" or die("can't create log file \n");
my $cnt = 0;
print LOG $src .....
[9] 재귀호출(recursive)을 이용한 파일 프로세스 use File::Find;
이 모듈을 사용하면 재귀호출에 의해 디렉토리안에 있는 디렉토리를 계속 검사하면서 원하는 파일을 읽거나 프로세스 할수 있다.
[10] informix DB를 열고 레코드를 query 해오는 경우 예제 open(LOG, ">$scriptName.log") or die("Can''t open file") ;

my $dbh;

my $db = "dbi:Informix:member";

my $err = &connectDBI(\$dbh,$db,''dbuser'');

$err && die "Error connecting: $err\n", print LOG "\n>>>>\nError connecting:\n$err\n";


$dbh->{RaiseError} = 1;

my %ee_hs = ();
my @files = `ls`;

my $i=0;
foreach my $file (@files) .....
[11] hash of hash읽어오기 #hash create
%ee_hs = ()

#hash of hash create
$ee_hs{''aa''}{''123''} = ''aa123'';

#hash read by key
foreach my $k (keys %ee_hs) {
print STDERR "##hash $k ** $ee_hs{$k}\n";

foreach my $kk (keys %{ $ee_hs{$k}} ) {
print STDERR "####hash $kk ** $ee_hs{$k}{$kk}\n";
};
}
[12] file lock을 함수로 만들어 사용하는 방법 펄 마니아 김영수님이 올리신 소스입니다.

파일을 쓰기전에 잠금 파일을 만들어 사용하는 방법입니다.
운영시스템의 제약이 없고 펄에서 사용하는 flock 함수가 유닉스에서만 지원하기 때문에
윈도에서 사용시 문제가 생기고....
이런 골치아픈것을 없앨수 있습니다.

# 파일 lock 함수
# 파일이 열려있는지 검사해서 열려 있지 않으면
# 임시 lock파일 생성해서 최대 대기시간 만큼 기다리게 합니다.
# 시간은 time함수로 계산합니다.
sub lock {
local ($file) = @_;
$LockFile = "$file.lock";
$EndTime = time + 45;

.....
[13] SMTP를 이용한 메일 보내기 예제
#!/usr/bin/perl -w
use Net::SMTP;
use CGI qw(:standard);
print header;

$ip = $ENV{''REMOTE_ADDR''};

if ( $ip ) {
sendmail();
}

sub sendmail {

$smtp = Net::SMTP->new(''mail.spiritualize.org'', Debug => 1, );
$smtp->mail(''inner@spiritualize.org'');
$smtp->to(''inner'');

$smtp->data();
$smtp->datasend("To: inner\n"); < .....
[14] cmp , <=> 의 사용예입니다. 문자열 비교형인 "cmp" 의 사용시 결과과값입니다.

print ( "1" cmp "2" ); 결과 -1
print ( "11" cmp "2" ); 결과 -1
print ( "2" cmp "1" ); 결과 1
print ( "1" cmp "1" ); 결과 0


숫자 비교형인 "<=>"의 사용시 결과과값입니다.

print ( 1 <=> 2 ); 결과 -1
print ( 2 <=> 1 ); 결과 1
print ( 1 <=> 1 ); 결과 0
[15] 아이피를 기록했다가 바뀌는걸 확인해주는 간단한 소스입니다. 펄마니아 현승님께서 작성하신 코드입니다.
예제로 좋은거 같아서 올렸습니다.


#!/usr/bin/perl
print "Content-type: text/html\n\n";

$ip = $ENV{''REMOTE_ADDR''};
$path_log = "./path.log";

if ( -e"$path_log" ){
open(FILE,"<$path_log");
$loged_ip=<FILE>;
close(FILE);
if ( $loged_ip eq $ip ){
print "아이피가 안바꼈네요... $ip 입니다.";
}
else{
print "아이피가 바뀌었슴다!!! $lo .....
[16] 문자열과 숫자의 비교시 차이점 펄은 두개의 문자열 값을 비교할때와 숫자를 비교할때 다른 비교연산자를 사용한다.
만약 프로그램시 이것을 혼동하여 사용하게 되면 완전히 예상과 다른 결과를 얻게 된다.

문자열 비교시는 (lt, gt, eq, le, ge, cmp 를 사용한다)
''b'' gt ''a'' #결과값: 참(true): b는 a보다 크다
''b'' eq ''B'' #결과값: 거짓(false): b와 B는 다르다(대소문자 구별)
"this" eq "this " #결과값: 거짓(false): this 다음에 공백문자가 있어 다르게 취급
"Can" cmp "Cannot" #결과값: -1 (왼쪽의 값이 작으면: -1, 두값이 같으면: 0, 왼쪽의 값이 크면: 1을 돌 .....
[17] -w 옵션을 사용하면 정확한 에러메세지를 보여줍니다. 보통 perl 코드를 실행시킬 때 다음과 같은 방법을 사용합니다.

perl test.pl

하지만 정확한 경고 메세지(모든 에러 및 에러 가능성이 있는 코드 포함)를 보고 싶다면,
다음처럼 -w 옵션을 사용하면 됩니다.

perl -w test.pl

-w을 넣을경우, 에러는 나오진 않았지만 그리고 아무 이상 없이 실행되던 소스라도
경고 메세지가 나오는 경우가 있다(에러를 낼 가능성이 있는 부분). 경고가 나오는 부분을 고쳐나가면 더욱 안전하고 좋은 프로그램를 만들 수 있다

[18] \를 숫자와 함께쓰면 메타문자가 됩니다. print "1234"; # 출력: 1234
print "\a"; #출력: a

그런데 요건
print "\1\2"; #아무것도 출력안하거나, 이상한 문자열 출력

\를 메타문자( \ | ( ) [ { ^ $ * + ? . )와 사용하면 단순한 문자열이 됩니다.(요건 다 알고 있는 사실이죠).
print "\|\\\$"; # 출력 |\$

그런데 \를 숫자와 사용하면 반대로 단순문자에서 메타문자(\d \w \s 처럼)가 됩니다.
패턴 정규식에서 \d가 숫자를 의미하는 [0-9] 하고 같은것처럼요.

정확이 펄에서 "\숫자"로 사용되는 메타문자가 어떤것을 지칭하는지는 잘모르지만
프린트문에서 "\1\2\3\4"의 출력 .....
[19] foreach 명령어 사용시 데이타를 레퍼런스하는거 아세요 open(TXT, "h:/ppp/www/1234.txt");
@all = <TXT>;
close TXT;

foreach (@all){
#문자열을 검색하는 부분
$_ =~ s/^P678F11_01/ATCG450/ {
#줄에서 시작하는 부분에 있는 매치된 문자열만 치환
#foreach는 데이타를 레퍼런스로 사용합니다.
#그래서 안에서 변경되면 자동적으로 원래 데이타가 변경이 되죠
}

open(TXT, ">h:/ppp/www/1234.txt.new");
print TXT @all;
close TXT;

[20] 한글로 된 요일 생성하기-배열변수 이용해서 이리하면 현재일자의 한글 요일을 리턴합니다.

$thisday = ("일","월","화","수","목","금","토") [(localtime) [6]];


localtime함수는 현재 시간에 대한 정보를 리스트로 리턴합니다.

# 0 1 2 3 4 5 6 7 8
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;

배열변수의 경우
@a = (0,1,2,3,4,5,6);
한 값을 참조하는 방법은 $a[4]와 같은 방법으로 하듯

리스트인경우
(0,1,2,3,4,5)[4]해도 결과는 .....
    [1] [2] [3]    
Javascript Source List :