'perl'에 해당되는 글 3건

  1. 2009.12.05 PERL TIP
  2. 2009.11.20 MAC에서 Perl/Tk 컴파일하기
  3. 2009.11.17 Perl Debug command 정리
ASIC SoC2009. 12. 5. 10:29
1. Perl Script에서 환경 변수를 가지고 오기
    많은 파일을 동시에 사용하면서, 설정을 하여야 할 경우 실행 옵션으로 주는 것이 편합니다.
    하지만, 패스같은 것들은 그냥 환경변수에 세팅해 놓고 PERL 스크립트에서 환경 변수를 받아들여서
    패스로 사용하는 것이 편합니다.
    아래는 그에 대한 예입니다.

     $WORK_ROOT = $ENV{"WORK_ROOT"};
     print STDOUT "[MSG AAAA] $WORK_ROOT\n";  

    실행 결과는 아래와 같다.

     [MSG AAAA] /home/GUNDAM/work_code
   
2. 스타트 옵션에서 -I로 패스를 지정할 수 있습니다.
   그런데 이것이 상대 패스로 지정되면, 시작하는 폴더가 유저마다 틀릴 경우,  귀찮게 됩니다.
    그리고 절대 패스로 해두면, 개발 환경을 다른데로 옮겼을때, 다시 귀찮게 됩니다.
   이런것을 해결하는 방법이  환경 변수를 설정해서 지정하면 해결됩니다.

   export PERL5LIB=/home/GUNDAM/PerlScript/
 
위에서 사용하는 환경 변수 PERL5LIB은 PERL 실행시 기본으로 모듈을 검색하는 @INC패스에 포함되지
않은 경우 추가로 찾을 수 있도록 패스를 추가할 수 있는 환경 변수입니다.
3. 문자열 내에 괄호 ( ( ) 가 있을 경우
정규식 표현을 이리저리 해보았지만 잘 안되었는데
[ ]으로 둘러 싸면 인식을 한다.

$target_line2 = "do[(]\"\/check\/tools\/scripts";

으로 설정한다.


요새 뜬금없이 PERL을 쓰면서  정리하고 있는 것입니다.

'ASIC SoC' 카테고리의 다른 글

[SC] Structure  (0) 2010.01.18
[MIPS] OSX에서 MIPS C Compiler를 빌드하기  (0) 2009.12.17
Timing Chart  (0) 2009.11.08
SystemC에서 main() 함수 넣기  (0) 2009.11.04
SystemC에서 배포가능 버전 만들기  (0) 2009.11.01
Posted by GUNDAM_IM
MAC Life2009. 11. 20. 09:48
Perl은 스크립트 베이스로 움직이는 아주 쉬운 랭귀지중 하나입니다.
그냥 예전의 Basic처럼 풀어쓴다는 느낌으로 사용하며, 원래 목적은 스트링을 쉽게 처리하기 위한 것이 목적인 언어입니다.  

SoC의 테스트 환경을 빌드 할 경우에도,

PERL->PLI->Verilog

와 같이 하여서 몇가지 트릭으로 Command를 만들고, 보내기도 하기 때문에 유용하게 쓰일때가 많이 있습니다.

사실 저는 Makefile 신봉주의자에 가까워서, 모든 것을 Makefile로 해결하였습니다. 하지만  떄떄로 시뮬레이션할때 상호간에 Interactive한 환경을 빌드 할 경우 몇가지 옵션을 만들어서 해결해야 하는 것이어서, 사실상 그때마다, Makefile내에 새로운 Target을 지정하여 사용하였습니다.

이런 방식은

TCL/TK -> Makefile @ Multi Target

정도로 표현이 가능하겠습니다.

예를 들어서 언제 써먹냐 하면 SoC내의 부팅 옵션을 틀리게 지정하고 싶은 경우에
Make NANDBootSIM 을 하면 NAND Boot 되는 옵션으로 세팅되면서 시뮬레이션을 돌리지만,
그때마다 다른 조건들을 맞추어주거나 조건의 배열을 만들어주어야 하는 불편함도 좀 있습니다.


그래서 좀더  유연한 확장을 위해서 Makefile+Perl을 같이 사용하기 위해서 Perl환경을 꾸며보기로 했습니다.
명색이 그래도 그냥 Perl을 사용하긴 싫고 하여 Perl/Tk도 같이 붙여서 사용하는것이 좋을 듯 하였습니다.

시뮬레이션은 MAC에서 하지는 않지만, 그래도 Perl/Tk 스크립트를 짜고 간단한 테스트를 하는 것은 MacBook에서 수행해기 때문에 MAC에도 빌드해 두어야 할 필요성이 생겼습니다.
다행히 Perl자체는 이미 Leopard에 포함되어 있어서 사용에는 아무런 문제가 없습니다.

일단 코드는 아래 사이트에서 받아 볼 수 있습니다.

http://search.cpan.org/~srezic/Tk-804.028_501/

다운로드 받아서 빌드를 하면 잘 풀어집니다.

perl Makefile.PL
make
sudo make install

로 하면 잘 풀어서 컴파일이 됩니다.

중간 중간에 경고나 에러가 뜨는데, 그런것에 대해서 일일이 반응하시지 마시고 무시하고 진행하면 됩니다.

용법은 단순합니다. perl 스크립트의 시작시에 다음과 같이 한 줄을 넣으면 됩니다.

use Tk;

다음은 예제 스크립트입니다.

my $mw = MainWindow->new;
$mw->Label(-text => 'Hello I\'m Perl/Tk !')->pack;
$mw->Button(
    -text    => 'Quit',
    -command => sub { exit },
)->pack;
MainLoop;


test.pl이라는 이름으로 저장하고요

perl test.pl

을 하면 다음과 같이 창이 나타납니다.

사용자 삽입 이미지
tk는 좀 그렇다 치더라도
대량의 테스트 패턴을 인터렉트브한 상황에서 만들어야 할 경우 PLI/C도 유용한 환경입니다.
하지만 그때마다 PLI를 만드는것 보다는 Perl Script로 만들어서 동작시키는 것도 좋습니다.

'MAC Life' 카테고리의 다른 글

바텍이 Things 로 옮겼네요  (0) 2010.03.21
산호세 애플샵  (0) 2010.02.28
SIGGRAPH [2]  (0) 2009.08.07
CUDA on MAC OS  (0) 2009.06.23
맥에서 프로파일링 하기  (0) 2009.06.18
Posted by GUNDAM_IM
Hobby2009. 11. 17. 13:32
요새 갑자기 안쓰던 Perl을 쓸일이 생겨서 Perl을 열심히 공부하고 있습니다.
그렇다고 새로 짜는것도 아니고 전문가가 (정말 Perl의 전문가) 께서 작성한 코드를 디버깅 해야 하는 상황이 발생해서 고생하고 있습니다.

이리저리 하다가 필요한 것이 Perl 디버깅 커맨드를 따로 정리해 두는 것이 편할 것 같아서 정리해둡니다.
관련 내용은 아래 페이지에서 발췌했습니다.

대부분은 GDB 커맨드랑 비스므레 하기 때문에 쉽게 다가설 수 있습니다.
모듈 로딩 이라던가 기타 등등은 디버깅에서 확인하면 도움이 됩니다.

http://www.devshed.com/c/a/Perl/Using-The-Perl-Debugger/
 
요기 아래 링크로 가면 좀더 자세한 디버깅 정보를 확인할 수 있습니다.
설명도 좋고..
http://doc.perl.kr/twiki/bin/view/Perldoc/PerlDebtut


1. 디버깅 모드에 들어가기


펄은 자체적으로 디버깅 환경을 가지고 있습니다.

perl -d로 수행하면 되고 대개의 경우 스크립트 제일 처음에 있는

#/usr/bin/perl

라인에

#/usr/bin/perl  -d

옵션을 추가해서 실행하면 자동적으로 디버깅 모드에 들어갑니다.

2. 리스트 보기


"l" (L) 입니다. (I)가 아니고..
을 넣으면 스크립트 라인을 보여줍니다.

DB<1> l

6==> unless($ARGV[0])
7 {
8: print "ERROR: Please provide a valid input ID\n\n";
9 }
10
11 # get user input into variable
12: my $id = $ARGV[0];
13
14 # connect
15 # fix these as per your local settings

"l <line number>"로 지정된 라인을 볼 수 있습니다.

DB<3> l 19
19==> my $sendmail = "/usr/sbin/sendmail -t";


아니면 지정된 라인부터 몇 라인 까지 본다면

"l 20-25"
로 하면 됩니다.

DB<4> l 20-25
20==> my $reply_to = "Reply-to: foo\@bar.org";
21: my $subject = "Subject: FOOBAR";
22: my $content = "Hello and how are you doing? This is the message body";
23
24 # now retrieve email addresses and send mail to each
25: my $sth = $dbh->prepare("SELECT email FROM users WHERE users.id =
'$id'");


"V <line number>" 는 주어진 라인 을 기준으로 전후 라인을 보여줍니다.
DB<3> v 27
24: my $description = $ref->{'description'};
25: $sth->finish();
26
27 # now use the group ID to get the group text
28: my $sth = $dbh->prepare("SELECT group_text FROM groups WHERE
group_id =
'$gid'");
29: $sth->execute();
30: my $ref = $sth->fetchrow_hashref();
31: my $gtext = $ref->{'group_text'};
32: $sth->finish();
33

문자열을 찾고 싶다면 vi처럼

"/STRING" 을 하면 됩니다.

DB<3> /FOOBAR
21: my $subject = "Subject: FOOBAR";

3. 실행하기


다음 라인을 수행하고 싶다면

"s" 를 하면 됩니다.

main::(mailer.pl:6): unless($ARGV[0])
main::(mailer.pl:7): {
DB<1> s
main::(mailer.pl:12): my $id = $ARGV[0];
DB<1> s
main::(mailer.pl:16): my $dbh =
DBI->connect("DBI:mysql:database=db198;host=localhost", "root",
DBI->"secret",
{'RaiseError' => 1}) or die ("Cannot connect to database");
DB<1> s DBI::connect(/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi/DBI.pm
:442):
442: my $class = shift;
DB<1> s DBI::connect(/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi/DBI.pm
:443):

s 명령어는 gdb와 마찬가지로 한스텝씩 실행하면서 진행하고 서브 루틴이 나오면 해당 서브루틴으로 들어가서 수행하게 됩니다.

서브 루틴을 건너 뛰면서 수행하는 것은 gdb와 마찬가지로 n 입니다.

main::(mailer.pl:6): unless($ARGV[0])
main::(mailer.pl:7): {
DB<1> n
main::(mailer.pl:12): my $id = $ARGV[0];
DB<1> n
main::(mailer.pl:16): my $dbh =
DBI->connect("DBI:mysql:database=test;host=localhost", "root", "",
{'RaiseError' => 1}) or die ("Cannot connect to database");
DB<1> n



서브 루틴 안에 있다면 서브 루틴의 끝까지 수행하여야 하는 경우
"r" 명령을 이용해서 서브 루틴의 끝까지 진행할 수 있도록 합니다.

DB<1> s DBI::connect(/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi/DBI.pm
:443):
443: my($dsn, $user, $pass, $attr, $old_driver) = @_;
DB<1> r
scalar context return from DBI::connect: empty hash
main::(mailer.pl:19): my $sendmail = "/usr/sbin/sendmail -t";



4. 값을 보기

변수들의 값을 확인하는 방법입니다.
gdb와 같은 방식을 취하고 있습니다.

"x"  명령은 변수의 값을 확인할 수 있습니다.

DB<7> @friends = qw(Rachel Ross Joey Monica Chandler Phoebe);

DB<8> x @friends
0 'Rachel'
1 'Ross'
2 'Joey'
3 'Monica'
4 'Chandler'
5 'Phoebe

"p" 명령은 값을 프린트 할 수 있습니다.

DB<4> p $sendmail
/usr/sbin/sendmail -t

DB<7> $movie="Star Wars"

DB<8> p $movie
Star Wars


"V package_name"  명령은 지정된 패키지의 정보와 모든 내부 변수를 확인할 수 있습니다.

DB<32> V DBI
%DBI_methods = (
'db' => HASH(0x81e292c)
'CLEAR' => HASH(0x8281ff8)
'O' => 4
'DESTROY' => undef
'EXISTS' => HASH(0x8281ff8)
-> REUSED_ADDRESS
'FETCH' => HASH(0x808b198)
'O' => 1028
'FIRSTKEY' => HASH(0x8281ff8)
-> REUSED_ADDRESS
'NEXTKEY' => HASH(0x8281ff8)
-> REUSED_ADDRESS
'STORE' => HASH(0x8284968)
'O' => 1040
'_not_impl' => undef
'begin_work' => HASH(0x83155a8)
'O' => 1024
'U' => ARRAY(0x831556c)
0 1
1 2
2 '[ \\%attr ]'
'column_info' => HASH(0x81e2680)
'O' => 512
'U' => ARRAY(0x81e2644)
0 1
1 6
2 '$catalog, $schema, $table, $column [, \\%attr ]'
'commit' => HASH(0x8315608)
'O' => 1152
'U' => ARRAY(0x83155d8)
0 1
1 1
...


"X" 명령은 스크립트 전체의 변수와 환경 변수 등에 대한 모든 정보를 덤프시킵니다.

DB<32> X
FileHandle(STDIN) => fileno(0)
$^V = "\cE\cH\c@"
$2 = ''
$1 = 'main'
$movie = 'Star Wars'
$^WARNING_BITS = "\c@\c@\c@\c@\c@\c@\c@\c@\c@\c@\c@\c@"
$< = 515
FileHandle(stdin) => fileno(0)
@ARGV = (
0 'ueruir'
)
@INC = (
0 '/usr/lib/perl5/5.8.0/i386-linux-thread-multi'
1 '/usr/lib/perl5/5.8.0'
2 '/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi'
3 '/usr/lib/perl5/site_perl/5.8.0'
4 '/usr/lib/perl5/site_perl'
5 '/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi'
6 '/usr/lib/perl5/vendor_perl/5.8.0'
7 '/usr/lib/perl5/vendor_perl'
8 '.'
)
%INC = (
'AutoLoader.pm' => '/usr/lib/perl5/5.8.0/AutoLoader.pm'
'Carp.pm' => '/usr/lib/perl5/5.8.0/Carp.pm'
'Carp/Heavy.pm' => '/usr/lib/perl5/5.8.0/Carp/Heavy.pm'
'Config.pm' => '/usr/lib/perl5/5.8.0/i386-linux-thread-multi/Config.pm'
'DBD/mysql.pm' => '/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBD/mysql.pm'


"M"은 로딩된 모든 모듈에 대한 정보를 보여줍니다.

DB<32> M
'AutoLoader.pm' => '5.59 from /usr/lib/perl5/5.8.0/AutoLoader.pm'
'Carp.pm' => '1.01 from /usr/lib/perl5/5.8.0/Carp.pm' 'Carp/Heavy.pm' => '/usr/lib/perl5/5.8.0/Carp/Heavy.pm'
'Config.pm' => '/usr/lib/perl5/5.8.0/i386-linux-thread-multi/Config.pm'
'DBD/mysql.pm' => '2.0416 from /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBD/mysql.pm'
'DBI.pm' => '1.30 from /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi/DBI.pm'
'DynaLoader.pm' => '1.04 from /usr/lib/perl5/5.8.0/i386-linux-thread-multi/DynaLoader.pm'
'Exporter.pm' => '5.566 from /usr/lib/perl5/5.8.0/Exporter.pm' 'Exporter/Heavy.pm' => '5.566 from /usr/lib/perl5/5.8.0/Exporter/Heavy.pm'
'Term/Cap.pm' => '1.07 from /usr/lib/perl5/5.8.0/Term/Cap.pm' 'Term/ReadLine.pm' => '1.00 from /usr/lib/perl5/5.8.0/Term/ReadLine.pm'
'dumpvar.pl' => '/usr/lib/perl5/5.8.0/dumpvar.pl'
'perl5db.pl' => '1.19 from /usr/lib/perl5/5.8.0/perl5db.pl' 'strict.pm' => '1.02 from /usr/lib/perl5/5.8.0/strict.pm' 'vars.pm' => '1.01 from /usr/lib/perl5/5.8.0/vars.pm' 'warnings.pm' => '1.00 from /usr/lib/perl5/5.8.0/warnings.pm' 'warnings/register.pm' => '1.00 from /usr/lib/perl5/5.8.0/warnings/register.pm'

소문자 로 쓰여진

"m Package_name"은 지정된 패키지의 함수 등에 대한 정보를 보여줍니다.

DB<33> m DBI
CLONE
_clone_dbis
_dbtype_names
_debug_dispatch
_rebless
_rebless_dbtype_subclass
_set_isa
_setup_driver
available_drivers
bootstrap
carp
confess
connect
connect_cached
connect_test_perf
constant
croak
data_sources
dbi_profile
via Exporter: export_ok_tags
via Exporter: export_tags
via Exporter: export_to_level
via DynaLoader: AUTOLOAD
via DynaLoader: boot_DynaLoader
via DynaLoader: dl_install_xsub
...

마지막으로 "S" 명령은 현재 스크립트및 로딩된 스크립트에서의 서브 루틴 리스트를 모두 보여줍니다.

DB<35> S
AutoLoader::AUTOLOAD
AutoLoader::BEGIN AutoLoader::__ANON__[/usr/lib/perl5/5.8.0/AutoLoader.pm:96]
AutoLoader::import
AutoLoader::unimport
Carp::BEGIN
Carp::caller_info
Carp::carp
Carp::cluck
Carp::confess
Carp::croak
Carp::export_fail
Carp::format_arg
Carp::get_status
DBD::mysql::AUTOLOAD
DBD::mysql::BEGIN
DBD::mysql::_OdbcParse
DBD::mysql::_OdbcParseHost
DBD::mysql::db::ANSI2db
DBD::mysql::db::BEGIN
DBD::mysql::db::_SelectDB
DBD::mysql::db::admin
DBI::BEGIN
DBI::CLONE
DBI::DBI_tie::STORE
...


"s string"은 string으로 지정된 문자열을 포함한 함수 혹은 변수의 리스트를 보여줍니다.

DB<35> S connect
DBD::_::db::disconnect
DBD::_::dr::connect
DBD::_::dr::connect_cached
DBD::_::dr::disconnect_all
DBD::mysql::dr::connect
DBI::connect
DBI::connect_cached
DBI::connect_test_perf
DBI::disconnect
DBI::disconnect_all






'Hobby' 카테고리의 다른 글

아~~~ 아~~~ 얄미운 아이폰  (0) 2009.12.09
[DQ9] 오오 드디어 엔딩으로  (0) 2009.11.17
[DQ9] 드디어 마지막 장으로....  (0) 2009.11.12
Dragon Quest IX 열랩하기  (0) 2009.11.05
MockUp-재미있는 GUI Outliner 프로그램  (0) 2009.09.23
Posted by GUNDAM_IM