a2p - Awk to Perl translator
(a) a2p這一個程式是在/usr/bin/a2p,我所使用的糸統是linux redhat 7.0中文版
(b) shared library ==> libnsl.so.1 => /lib/libnsl.so.1 (0x40025000)
libdl.so.2 => /lib/libdl.so.2 (0x4003c000)
libm.so.6 => /lib/libm.so.6 (0x4003f000)
libc.so.6 => /lib/libc.so.6 (0x4005e000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x40181000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
(c) 此公用程式的主要用途是把awk語言轉成perl語言來執行。由awk轉來的perl� {式,功能會和原程式一樣,而且也 沒有awk的各種限制,像參數長度什麼的。在極少數情況下,轉換後的程式會比較慢;如果原� {式寫的很差,轉換程式可能無法用最有效率的perl敘述做到原來要做的事。你可以親自修 改轉換後的perl程式,提高執行效率,或加入新的功能。
(d) 參數的功用及其意義
用法 : a2p [options] filename
-D
設立除虫旗幟
-F
告訴a2p說這一個awk script是常和 -F switch關連
-n
如果輸入不能分割成陣列,我們可以用這個參數來區分它。
-
這個參數會使a2p假設輸入有number個fields.
-o
告訴a2p用舊版的awk特徵。
(e) 參數的程式范例
(1) –n
如:我們想把一個會處理password file的awk script,我們就必須這樣子輸入:
| a2p -7 -nlogin.password.uid.gid.gcos.shell.home |
任何的定義符號都可以拿來分割他們。
(2) - o
舊版與新版的差別有:舊版的awk有線性迴圈line loop),新版的就沒有。在舊版的awk,sprintf對它的參數是非常飢渴的。例:print sprintf(some_args), extra_args;舊版的awk會把extra_args當成sprintf的參數;新版的就把他們當成print的參數。
(f) 其他
假設有一awk程式檔名為a,其內容為:
###################################################################
# {for(x=3;x<=NF;x++) #
# if($x<0){print"bottomed out!";break} #
# } #
# #{for (x=3;x<=NF;x++) #
# #if($x==0){print"Get next item",continue} #
###################################################################
現我在命列輸入 a2p a ,過後就可以看到內容如下:
#####################################################################
# #!/usr/bin/perl #
# eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' #
# if $running_under_some_shell; #
# # this emulates #! processing on NIH machines. #
# # (remove #! line above if indigestible) #
# #
# eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift; #
# # process any FOO=bar switches #
# #
# $[ = 1; # set array base to 1 #
# $, = ' '; # set output field separator #
# $\ = "\n"; # set output record separator #
# #
# while (<>) { #
# chomp; # strip record separator #
# @Fld = split(' ', $_, 9999); #
# for ($X = 3; $X <= $#Fld; $X++) { #
# If ($Fld[$X] < 0) { #
# print 'bottomed out!'; #
# last; #
# } #
# } #
# #
# #{for (x=3;x<=NF;x++) #
# # if($x==0){print"Get next item",continue} #
# } #
#####################################################################
由此可以看出,程式已被轉成perl程式語言了。
轉成perl語言儲存以後,要以chmod +x來使之可以執行,執行的效果和原本的�
{式一樣,但是如果轉換以後的perl程式無法執行,那是因為程式轉得不夠好,所以要自已debug。