#
環境 :
個人 pc xp 一臺 ;
使用 :
官方下載: mysql-noinstall-5.1.36-win32.zip
1. 解壓 成2個 (文件夾)
mysql-5.1.36-win32_1 (主)
mysql-5.1.36-win32_2 (從)
2. 配置文件修改
主服務器配置修改
>mysql-5.1.36-win32_1/my-small.ini 修改名稱為 my.ini
>修改剛才 my.ini 文件的
>啟動 mysql-5.1.36-win32_1/bin/mysqld.exe --defaults-file=..youpath .my-small.ini
>使用 主 mysql -u root 創建同步角色
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.*
TO backup@'127.0.0.1'
IDENTIFIED BY '1234';

>并且運行
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 106 | test | backup |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
從服務器配置:
>mysql-5.1.36-win32_2/my-small.ini 修改名稱為 my.ini
>修改剛才 my.ini 文件的
[client]
#password = your_password
port = 3308
socket = /tmp/mysql.sock

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
server-id = 2
master-host = 127.0.0.1
master-user = backup
master-password = 1234
master-port = 3307

port = 3308
>啟動 mysql-5.1.36-win32_2/bin/mysqld.exe ( 我這會有個警告,沒事 )
>參考 主服務器運行的 show master status; 數據
slave stop;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=106;
slave start;

然后 :
在主mysql服務器
use test
create table tt (ii int);
然后在從mysql服務器
use test
show tables;
mysql> show tables ;
+----------------+
| Tables_in_test |
+----------------+
| tt |
+----------------+
1 row in set (0.00 sec)
f tplib模塊定義了FTP類和一些方法,用以進行客戶端的ftp編程。可以用python編寫一個自已的ftp客戶端程序,用于下載文件或鏡像站點。如果想了解ftp協議的詳細內容,請參考RFC959。
該模塊是python的通用模塊,所以默認應該已安裝。ftplib模塊使用很簡單,暫時只有一個FTP類和十幾個函數。
下面用一個交互方式演示一下ftplib的主要功能。
>>> from ftplib import FTP
>>> ftp = FTP('ftp.cwi.nl') # connect to host, default port
>>> ftp.login() # user anonymous, passwd anonymous@
>>> ftp.retrlines('LIST') # list directory contents
total 24418
drwxrwsr-x 5 ftp-usr pdmaint 1536 Mar 20 09:48 .
dr-xr-srwt 105 ftp-usr pdmaint 1536 Mar 21 14:32 ..
-rw-r--r-- 1 ftp-usr pdmaint 5305 Mar 20 09:48 INDEX
.
.
.
>>> ftp.retrbinary('RETR README', open('README', 'wb').write)
'226 Transfer complete.'
>>> ftp.quit()
下面一個下載文件的示例
#!/usr/bin/env python
#author:Jims of http://www.ringkee.com/
#create date: 2005/02/05
#description: Using ftplib module download a file from a ftp server.
from ftplib import FTP
ftp=FTP()
ftp.set_debuglevel(2) #打開調試級別2,顯示詳細信息
ftp.connect('ftp_server','port') #連接
ftp.login('username','password') #登錄,如果匿名登錄則用空串代替即可
print ftp.getwelcome() #顯示ftp服務器歡迎信息
ftp.cwd('xxx/xxx/') #選擇操作目錄
bufsize = 1024 #設置緩沖塊大小
filename='dog.jpg'
file_handler = open(filename,'wb').write #以寫模式在本地打開文件
ftp.retrbinary('RETR dog.jpg',file_handler,bufsize) #接收服務器上文件并寫入本地文件
ftp.set_debuglevel(0) #關閉調試
ftp.quit() #退出ftp服務器
下面一個上傳文件的示例,要成功運行該腳本,需在ftp服務器上有上傳文件的權限。
#!/usr/bin/env python
#author:Jims of http://www.ringkee.com/
#create date: 2005/02/05
#description: Using ftplib module upload a file to a ftp server.
from ftplib import FTP
ftp=FTP()
ftp.set_debuglevel(2)
ftp.connect('ftp_server','port')
ftp.login('username','password')
print ftp.getwelcome()
ftp.cwd('xxx/xxx/')
bufsize = 1024
filename='dog.jpg'
file_handler = open(filename,'rb')
ftp.storbinary('STOR dog.jpg',file_handler,bufsize) #上傳文件
ftp.set_debuglevel(0)
file_handler.close() #關閉文件
ftp.quit()
hadoop 原理參考: 用 Hadoop 進行分布式并行編程
官方中文文檔: http://hadoop.apache.org/core/docs/r0.18.2/cn/index.html
1. 首先安裝 cygwin ssh 參考 windows ssh 搭建
2. 搭建hadoop 參考 Cygwin下的Hadoop快速入門-偽分布式模式的查缺補漏
這里還有 cygwin putty 控制臺方法設置
3. 開發環境和 demo 參考
通過參考應該環境的搭建沒問題,我這搭建成功了,說下我這一些注意到地方吧
1. 我這使用的最新版本的 hadoop-0.20.0 在參考文檔中,修改 hadoop-site.xml 。
在這個版本已經在conf下找不到了,我這嘗試修改的 hdfs-site.xml 。測試的時候竟然通過了。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
<property>
<name>dfs.data.dir</name>
<!--linux -->
<!--<value>/home/lky/tools/java/hadoop-0.18.3/dfs</value>-->
<value>C:\\cygwin\\home\\lky\\tools\\java\\hadoop-0.18.3\\dfs\\</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>60</value>
<description>Number of minutes between trash checkpoints.
If zero, the trash feature is disabled.
</description>
</property>
</configuration>
在實際中也可以 由文件導入 db 庫中
awk -F: '{print $1; print $0}' < /etc/passwd 顯示為:
root
root:x:0:0:root:/root:/bin/bash
bin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm
adm:x:3:4:adm:/var/adm:/sbin/nologin
............
awk -F: '{print $1; print $0}' < /etc/passwd |sed 's/\\/\\\\/g' | db_load -T -t hash passwd.db
hash 入庫為 key 為奇數行,value 為 偶數行
下面轉,收集
bsddb模塊是用來操作bdb的模塊,bdb是著名的Berkeley DB,它的性能非常好,mysql的存儲后端引擎都支持bdb的方式。這里簡單介紹一些關于bsddb的使用方法。
bdb不同于一般的關系數據庫,它存儲的數據只能是以key和value組成的一對數據,使用就像python的字典一樣,它不能直接表示多個字段,當要存儲多個字段的數據時,只能把數據作為一個整體存放到value中。
使用bsddb面臨的第一問題是使用什么數據訪問方法,bdb支持四種:btree, hash, queue, recno。這里先說說它們有什么區別,btree是用的樹結構來才存儲的數據,查詢速度很快,可以存儲任意復雜的key和value。hash是用的hash算法,速度其實和btree比差不多的,但是當數據量特別巨大時,應該使用hash。queue是隊列操作,它有一個限制,它只能存儲定長的數據,也就是說value的長度是固定的!但是queue可以保持數據的先進先出,并且對數據的插入做了特殊的優化,并且提供行級鎖。queue的key必須是數字。recno和queue類似,但是它可以支持變長的value,它的key同樣也是數字。
這里先對這四種數據訪問方法分別做打開數據庫,簡單插入一條數據的演示。
對于python的bsddb模塊來說,打開數據庫的操作有兩種方式,一是使用原始的接口,就是先打開一個環境,然后從這個環境中打開一個數據庫,就像下面:
import bsddb

dbenv = bsddb.db.DBEnv()
dbenv.open(home, bsddb.db.DB_CREATE | bsddb.db.DB_INIT_MPOOL)
d = bsddb.db.DB(dbenv)
d.open(filename, bsddb.db.DB_BTREE, bsddb.db.DB_CREATE, 0666)
還有一種方式是python特有的,這個是bsddb模塊本身對上面的過程做了包裝,比如打開btree的:
import bsddb

db = bsddb.btopen('test.db', 'c')
看起來比上面的簡單多了吧。但這種方式提供的接口很有限,也只有很簡單的功能,沒有第一種的靈活,但是它在python2.5的版本里是線程安全的。這里都介紹一下。
看看一個例子:
#-*- encoding: gb2312 -*-
import os, sys, string
import bsddb, time
home = "db_home"
filename = "test.db"
try:
# 創建home目錄
os.mkdir(home)
except:
pass
# 創建數據庫環境
dbenv = bsddb.db.DBEnv()
# 打開數據庫環境
dbenv.open(home, bsddb.db.DB_CREATE | bsddb.db.DB_INIT_MPOOL)
# 創建數據庫對象
d = bsddb.db.DB(dbenv)
# 打開數據庫, 這里的第二個參數就是指定使用什么數據訪問方法
# btree是 bsddb.db.DB_BTREE, hash是bsddb.db.DB_HASH
# queu 是 bsddb.db.DB_QUEUE, recno 是bsddb.db.DB_RECNO
d.open(filename, bsddb.db.DB_BTREE, bsddb.db.DB_CREATE, 0666)
# 插入一條數據,注意queue和recno的key不能是字符串的,應該是數字
d.put('test1', 'zhaowei')
print d.items()
# 關閉,這時會把數據寫回文件
d.close()
dbenv.close()
下面來個使用queue的,注意看有什么區別:
#-*- encoding: gb2312 -*-
import os, sys, string
import bsddb, time

home = "db_home"
filename = "testqueue.db"
try:
os.mkdir(home)
except:
pass

dbenv = bsddb.db.DBEnv()
dbenv.open(home, bsddb.db.DB_CREATE | bsddb.db.DB_INIT_MPOOL)
d = bsddb.db.DB(dbenv)
# queue必須要設置一個value的長度,它的value是定長的
d.set_re_len(40)
d.open(filename, bsddb.db.DB_QUEUE, bsddb.db.DB_CREATE, 0666)
# 它的key必須是數字
d.put(1, 'zhaowei')
print d.items()

d.close()
dbenv.close()
那簡單的第二種方式使用如下, 要簡潔很多了:
import bsddb

d = bsddb.hashopen("aaa.db", "c")
d['test1'] = "zhaowei"
print d.items()
d.close()
svn log svn://127.0.0.1/zxProject/ --username xxxxxx --password xxxxxx |grep "2009-05-29 16:38*"
[xx@wap01 xx]$ svn log -v -r134 svn://127.0.0.1/zxProject/ --username xxxxxx --password xxxxxx
[xx@wap01 xx]$ svn log -v -r134:135 svn://127.0.0.1/zxProject/ --username xxxxxx --password xxxxxx
轉http://favor.javaeye.com/blog/320522
svn 命令
1、將文件checkout到本地目錄
svn checkout path(path是服務器上的目錄)
例如: svn checkout svn://192.168.1.1/pro/domain
簡寫: svn co
2、往版本庫中添加新的文件
svn add file
例如: svn add test.php(添加test.php)
svn add *.php(添加當前目錄下所有的php文件)
3、將改動的文件提交到版本庫
svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(如果選擇了保持鎖,就使用–no-unlock開關)
例如: svn commit -m “add test file for my test“ test.php
簡寫: svn ci
4、加鎖/解鎖
svn lock -m “LockMessage“ [--force] PATH
例如: svn lock -m “lock test file“ test.php
svn unlock PATH
5、更新到某個版本
svn update -r m path
例如:
svn update如果后面沒有目錄,默認將當前目錄以及子目錄下的所有文件都更新到最新版本。
svn update -r 200 test.php(將版本庫中的文件test.php還原到版本200)
svn update test.php(更新,于版本庫同步。如果在提交的時候提示過期的話,是因為沖突,需要先update,修改文件,然后清除 svn resolved,最后再提交commit)
簡寫: svn up
6、查看文件或者目錄狀態
1) svn status path(目錄下的文件和子目錄的狀態,正常狀態不顯示)
【?:不在 svn的控制中;M:內容被修改;C:發生沖突;A:預定加入到版本庫;K:被鎖定】
2) svn status -v path(顯示文件和子目錄狀態)
第一列保持相同,第二列顯示工作版本號,第三和第四列顯示最后一次修改的版本號和修改人。
注: svn status、 svn diff和 svn revert這三條命令在沒有網絡的情況下也可以執行的,原因是 svn在本地的. svn中保留了本地版本的原始拷貝。
簡寫: svn st
7、刪除文件
svn delete path -m “delete test fle“
例如: svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”
或者直接 svn delete test.php 然后再 svn ci -m ‘delete test file‘,推薦使用這種
簡寫: svn (del, remove, rm)
8、查看日志
svn log path
例如: svn log test.php 顯示這個文件的所有修改記錄,及其版本號的變化
9、查看文件詳細信息
svn info path
例如: svn info test.php
10、比較差異
svn diff path(將修改的文件與基礎版本比較)
例如: svn diff test.php
svn diff -r m:n path(對版本m和版本n比較差異)
例如: svn diff -r 200:201 test.php
簡寫: svn di
11、將兩個版本之間的差異合并到當前文件
svn merge -r m:n path
例如: svn merge -r 200:205 test.php(將版本200與205之間的差異合并到當前文件,但是一般都會產生沖突,需要處理一下)
12、 SVN 幫助
svn help
svn help ci
13、版本庫下的文件和目錄列表
svn list path
顯示path目錄下的所有屬于版本庫的文件和目錄
簡寫: svn ls
14、創建納入版本控制下的新目錄
svn mkdir: 創建納入版本控制下的新目錄。
用法: 1、mkdir PATH…
2、mkdir URL…
創建版本控制的目錄。
1、每一個以工作副本 PATH 指定的目錄,都會創建在本地端,并且加入新增
調度,以待下一次的提交。
2、每個以URL指定的目錄,都會透過立即提交于倉庫中創建。
在這兩個情況下,所有的中間目錄都必須事先存在。
15、恢復本地修改
svn revert: 恢復原始未改變的工作副本文件 (恢復大部份的本地修改)。revert:
用法: revert PATH…
注意: 本子命令不會存取網絡,并且會解除沖突的狀況。但是它不會恢復
被刪除的目錄
16、代碼庫URL變更
svn switch (sw): 更新工作副本至不同的URL。
用法: 1、switch URL [PATH]
2、switch –relocate FROM TO [PATH...]
1、更新你的工作副本,映射到一個新的URL,其行為跟“ svn update”很像,也會將
服務器上文件與本地文件合并。這是將工作副本對應到同一倉庫中某個分支或者標記的
方法。
2、改寫工作副本的URL元數據,以反映單純的URL上的改變。當倉庫的根URL變動
(比如方案名或是主機名稱變動),但是工作副本仍舊對映到同一倉庫的同一目錄時使用
這個命令更新工作副本與倉庫的對應關系。
17、解決沖突
svn resolved: 移除工作副本的目錄或文件的“沖突”狀態。
用法: resolved PATH…
注意: 本子命令不會依語法來解決沖突或是移除沖突標記;它只是移除沖突的
相關文件,然后讓 PATH 可以再次提交。
18、輸出指定文件或URL的內容。
svn cat 目標[@版本]…如果指定了版本,將從指定的版本開始查找。
svn cat -r PREV filename > filename (PREV 是上一版本,也可以寫具體版本號,這樣輸出結果是可以提交的)
參考:
顯示 【sheet數】【sheet Name】【(第一行,第一列)】
print sheets[0][1][(0,0)]
from pyExcelerator import *
sheets = parse_xls('src/天娛版權明確的歌曲清單.xls')
sdata=sheets[0][1]
#按行數 迭代
for tnum in range(max([tmp[0] for tmp in sdata])):
print sdata[(tnum,0)],'-',sdata[(tnum,1)]
from pyExcelerator import *
import os
sheets = parse_xls('xls/版權確認清單表20090601.3.xls')
cpcc= parse_xls('xls/CP對應表.xls')

g2u=lambda str : str.decode('gbk')
bmug=lambda str : unicode(str).encode("gbk")
def cfsize(cha):
if len(cha)==1:
return ord(cha)-ord('A')
else :
fsize=0
fnum=cfsize('Z')+1
cc=list(cha)
for tnum in range(len(cc)):
fsize+=fnum*tnum+cfsize(cc[tnum])
return fsize


cpccmap={}
tsdata=cpcc[0][1]
for tnum in range(max([tmp[0] for tmp in tsdata]))[:]:
cpname=tsdata[(tnum,cfsize('A'))]
cpid=("%s" % (tsdata[(tnum,cfsize('B'))])).split(".")[0]
cpccmap[cpname]=cpid


def insertData(cpid,cpname, music,actor,copyrightname,ytime,txls,rows):
#print music,actor,cpname,ytime,txls,rows
txls.write(rows,cfsize('A'),music)
txls.write(rows,cfsize('B'),actor)
txls.write(rows,cfsize('C'),cpname)
txls.write(rows,cfsize('D'),u'中國大陸')
txls.write(rows,cfsize('E'),u'無')
txls.write(rows,cfsize('F'),u'否')
txls.write(rows,cfsize('G'),u'否')
txls.write(rows,cfsize('H'),u'無')
txls.write(rows,cfsize('I'),ytime.split(' ')[0])
txls.write(rows,cfsize('J'),u'無')
txls.write(rows,cfsize('K'),'0')
txls.write(rows,cfsize('L'),u'許可')
txls.write(rows,cfsize('M'),'200')
txls.write(rows,cfsize('N'),u'許可')
txls.write(rows,cfsize('O'),'0')
txls.write(rows,cfsize('P'),u'許可')
txls.write(rows,cfsize('Q'),'0')
txls.write(rows,cfsize('U'),copyrightname)
txls.write(rows,cfsize('V'),'100%')
txls.write(rows,cfsize('W'),cpname)
txls.write(rows,cfsize('X'),'100%')


cpmap={}
for tsdata in sheets :
try:
sdata=tsdata[1]
#按行數 迭代
for tnum in range(max([tmp[0] for tmp in sdata]))[1:]:
cpid=sdata[(tnum,cfsize('C'))]
cpname=sdata[(tnum,cfsize('D'))] #.upper()
music=sdata[(tnum,cfsize('E'))]
actor=sdata[(tnum,cfsize('F'))]
copyrightname=sdata[(tnum,cfsize('H'))]
ytime=sdata[(tnum,cfsize('K'))]
if not cpmap.has_key(cpname) :
tmpf=bmug("cp -r 0000_20090602/ data3/"+cpid+"_20090602/ " )
os.system(tmpf)
txls=Workbook()
tsheet=txls.add_sheet(u'版權列表')
cpmap[cpname]=[txls,1,'data3/'+cpid+u'_20090602/產品信息/'+cpid+'_20090602_01_copyright.xls',tsheet]
titles='歌曲名稱 演唱者 提供者 授權區域 電子化版權信息(有/無) 需要DRM處理(是/否) 支持二次開發(是/否) 相關版權合同記錄(有/無) 授權期限 全曲授權 全曲價格 彩鈴授權 彩鈴價格 IVR授權 IVR價格 振鈴授權 振鈴價格 ISRC UPC ICPN 詞曲著作權權利人一 詞曲比例一 錄音權權利人一 錄音比例一 詞曲著作權權利人二 詞曲比例二 錄音權權利人二 錄音比例二 詞曲著作權權利人三 詞曲比例三 錄音權權利人三 錄音比例三 其它'.split('\t')
for ttnum in range(len(titles)):
tsheet.write(0,ttnum,g2u(titles[ttnum]))
insertData(cpid,cpname, music,actor,copyrightname,ytime,tsheet,1)
else :
tsheet=cpmap[cpname][3]
cpmap[cpname][1]=cpmap[cpname][1]+1
insertData(cpid,cpname, music,actor,copyrightname,ytime,tsheet,cpmap[cpname][1])
except :
print "[error]: ", music,actor,cpname,ytime,txls
pass


for tkey in cpmap.keys() :
ct=cpmap[tkey]
print ct[2]
ct[0].save(ct[2])


sudo apt-get install openvpn
mkdir /etc/openvpn/config
cp config-cc /etc/openvpn/config
#config-cc里有
ca.crt
client-zz.ovpn
liukaiyi.crt
liukaiyi.csr
liukaiyi.key
cd /etc/openvpn/config
sudo openvpn --config client-zz.ovpn
這里 我就成功了
ping 10.1.2.22
ok
svn 幫助文檔,大體上瀏覽了下 一些比較好的特性 有:
http://www.subversion.org.cn/svnbook/
分支與合并
鎖定
svnsync
版本庫鉤子
一個SVN Python狀態爬蟲
注意 使用用戶 (sysmen) :
#指定新版本
vim ~.bashrc #添加了
alias svn="/usr/local/subversion/
bin/svn"
alias svnadmin="/usr/local/subversion/bin/svnadmin"
alias svnserve="/usr/local/subversion/bin/svnserve"
#最簡單 svn 服務器搭建
cd /home/sysman/src/svn/
svnadmin create test
svnserve -d -r /home/sysman/src/svn/test/
#最簡單配置
#vim svnserve.conf
[general]
password-db = passwd
realm = test
anon-access = read
auth-access = write
#查看
cd /home/sysman/src/svn/testsrc
svn list svn://127.0.0.1/test
#遷出
cd /home/sysman/src/svn/testsrc
svn checkout svn://127.0.0.1/test
#遷入
cd test
echo "google - baidu " > baidu
svn add baidu svn://127.0.0.1/test
svn commit -m 'add ok'
svn list svn://127.0.0.1/test
# baidu
# tt
#詳細參考 :
http://www.subversion.org.cn/svnbook/
在文檔中有關有意思的介紹 (svnsync):
http://www.subversion.org.cn/svnbook/1.4/svn.ref.svnsync.html
其他說明 :
1.幫助
svn help
或
svn help add
2.一般操作
更新你的工作拷貝
svn update
做出修改
svn add
svn delete
svn copy
svn move
檢驗修改
svn status
svn diff
可能會取消一些修改
svn revert
解決沖突(合并別人的修改)
svn update
svn resolved
提交你的修改
svn commit
Perl/Php Translation
arrays
hashes
data structures
array split/join
case conversion
string comparisons
functions
|
string matching operations
basename/dirname
environment variables
POST/GET parameters
HTML elements
URL encode
MySQL database access
|
— Perl arrays — |
— Php arrays — |
@a = ();
@a = ( 'xx', 11, 33.5, );
@a = 12..33;
$a[2] = 'something';
$len = scalar(@a);
# or
$len = @a;
@a3 = ('xx', @a1, @a2);
($x, $y) = @a;
$a[@a] = 'new'; # push
push
pop
shift
unshift
splice
foreach $i (@a) { .. }
|
$a = array();
$a = array( 'xx', 11, 33.5, );
$a = range(12,33);
$a[2] = 'something';
$len = count($a);
$a3 = array_merge('xx', $a1, $a2);
list($x, $y) = $a;
$a[] = 'new'; # push
array_push
array_pop
array_shift
array_unshift
array_splice
foreach ($a as $i) { .. }
|
— Perl hashes — |
— Php hashes — |
%h = ();
%h = ( 'x' => 'y',
'z' => 'w',
);
$h{'x'} = 7;
while (($key,$value) = each(%h))
{ .. }
$a = keys(%h);
$b = values(%h);
delete $h{'x'};
|
$h = array();
$h = array( 'x' => 'y',
'z' => 'w',
);
$h['x'] = 7;
foreach ($h as $key => $value)
{ .. }
$a = array_keys($h);
$b = array_values($h);
unset( $h['x'] );
|
— Perl data structures — |
— Php data structures — |
%h = ('a'=>13, 'b'=>25);
@x = ('hi', 'there', 'all',);
@mix = ( %h, @x,
[33..39],
{ x=>15, yy=>23, },
);
$mix[0]->{'b'} # == 25
$mix[0]{'b'} # == 25
$mix[2]->[2] # == 35
$mix[2][2] # == 35
|
$h = array('a'=>13, 'b'=>25);
$x = array('hi', 'there', 'all',);
$mix = array($h, $x,
range(33,39),
array('x'=>15, 'yy'=>23),
);
$mix[0]['b'] # == 25
$mix[2][2] # == 35
|
— Perl array split/join — |
— Php array split/join — |
@a = split( '|', $s );
@a = split( 's+', $s );
$s = join( '|', @a );
|
$a = preg_split( '/|/', $s,
-1, PREG_SPLIT_NO_EMPTY );
$a = preg_split( '/s+/', $s,
-1, PREG_SPLIT_NO_EMPTY );
$s = join( '|', $a );
|
— Perl case conversion — |
— Php case conversion — |
$s = lc($s);
$s = uc($s);
$s =~ tr/a-z/A-Z/;
|
$s = strtolower($s);
$s = strtoupper($s);
|
— Perl string comparisons — |
— Php string comparisons — |
$s1 eq $s2
$s1 lt $s2
|
strcmp($s1,$s2) == 0
# or
$s1 === $s2
strcmp($s1,$s2) < 0
|
— Perl functions — |
— Php functions — |
sub foo {
my @args = @_;
}
sub foo {
$x = 5;
}
foo2( @a, %h );
|
function foo() {
$args = func_get_args();
}
function foo() {
global $x;
$x = 5;
}
function foo2($x, $y) {
}
foo2( $a, $h );
|
— Perl string matching operations — |
— Php string matching operations — |
$s =~ m/(w+)/;
$substr = $1;
@all = ($s =~ m/(w+)/g);
$s =~ s/s+/X/;
$s =~ s/s+/X/g;
$s =~ s/^s+|s+$//g;
|
preg_match( "/(w+)/", $s, $match );
$substr = $match[1];
preg_match_all( "/(w+)/", $s, $match );
$all = $match[0];
$s = preg_replace( "/s+/", 'X', $s, 1 );
$s = preg_replace( "/s+/", 'X', $s );
$s = trim($s);
|
— Perl basename/dirname — |
— Php basename/dirname — |
use File::Basename;
$b = basename($path);
$d = dirname($path);
|
$b = basename($path);
$d = dirname($path);
|
— Perl environment variables — |
— Php environment variables — |
%ENV
$ENV{REQUEST_METHOD}
$ARGV[$i]
$0
|
$_SERVER
$_SERVER[REQUEST_METHOD]
$argv[$i+1]
$argv[0] # Php/CGI only
|
— Perl POST/GET parameters — |
— Php POST/GET parameters — |
#form/hyperlink parameters:
# s : single-valued
# m : multi-valued
use CGI (:standard);
$s = param('s');
@m = param('m');
@param_names = param();
$num_params = param();
|
#form/hyperlink parameters:
# s : single-valued
# m[] : multi-valued
# (such as multi-selections
# and checkbox groups)
$PARAM
= array_merge($_GET, $_POST);
$s = $PARAM['s']; # a scalar
$m = $PARAM['m']; # an array
$param_names = array_keys($PARAM);
$num_params = count($PARAM);
|
— Perl HTML elements — |
— Php HTML elements — |
use CGI (:standard);
$ref = "x.cgi";
a({href=>$ref}, "yy")
textfield({name=>"yy", size=>5})
password({name=>"yy", size=>5})
textarea({name=>"yy",
cols=>5, rows=>2})
submit({value=>"yy"})
button( {name=>"xx",
value=>"yy",
onclick=>"submit()",
}
)
%labels = (0=>'a',1=>'q',2=>'x');
popup_menu( { name=>"xx",
values=>[0..2],
labels=>%labels,
size=>4,
}
)
@a = ('xx','yy','zz');
radio_group( { name=>'nn',
values=> @a,
default=>'_',
linebreak=>1,
}
)
%labels = ('xx'=>'L1','yy'=>'L2');
@a = keys( %labels );
checkbox_group( { name=>'nn',
values=> @a,
labels=> %labels,
}
)
table(
Tr(
[
td(['a','b']),
td(['x','y']),
]
)
)
|
# The Perl/CGI functions have the
# additional property of "stability"
# when used in reentrant forms.
# The values of the HTML elements are
# set according to the incoming
# parameter values for those elements.
# The versions below are not stable.
$ref = "x.php";
<a href="<?php echo $ref?>">yy</a>
<input type=text name=yy size=5>
<input type=password name=yy size=5>
<textarea name=yy cols=5 rows=2>
</textarea>
<input type="submit" value=yy>
<input type="button"
name="xx" value="yy"
onclick="submit()">
<select name="xx" size="4">
<?php
$labels = array(0=>'a',1=>'q',2=>'x');
foreach (range(0,2) as $_)
echo "<option value='$_'>",
$labels[$_];
?>
</select>
$a = array('xx','yy','zz');
foreach ($a as $_)
echo "<input type=radio
name=nn value='$_'>$_<br>";
$labels = array('xx'=>'L1','yy'=>'L2');
foreach (array_keys($labels) as $_)
echo "<input type=checkbox
name=nn value='$_'>",
$labels[$_];
<table>
<tr>
<td>a</td><td>b</td>
</tr>
<tr>
<td>x</td><td>y</td>
</tr>
</table>
|
— Perl URL encode — |
— Php URL encode — |
use URI::Escape;
uri_escape($val)
uri_unescape($val)
|
urlencode($val)
urldecode($val)
|
— Perl MySQL database access — |
— Php MySQL database access — |
use DBI;
$dbh = DBI->connect(
'DBI:mysql:test:localhost',
$usr,$pwd
);
$dbh->do( $sql_op )
$query = $dbh->prepare( $sql_op );
$query->execute();
while(
@record = $query->fetchrow() )
{ .. }
$dbh->quote($val)
|
$dbh = mysql_connect(
'localhost', $usr, $pwd
);
mysql_query('USE test')
mysql_query( $sql_op );
$results = mysql_query( $sql_op );
while($record =
mysql_fetch_row($results))
{ .. }
"'" . addslashes($val) . "'"
|
|