#
环境 :
个人 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) . "'"
|
|