首页 | 摘要显示 | 上一页 1 2 3 4 5 6 7 8 9 10 11 下一页

Developer Archives

January 16, 2007

Perl中的正则表达式起步之一

    Perl是最强的文本处理语言, 其强大的正则表达式(Regular Expression)支持是其他语言所不及的. 正式表达在很多Unix的工具中都支持, 如grep, awk, sed等. Oracle从10g开始也引入了正式表达式的支持, 因此学好它对DBA来说也是很重要的.

    正则表达式只是用于字符串匹配的特征串, 我们从如何表示一个字符开始.

[ ] : 表示选择一个字符.
(.) : 表示任何了个除换行符(\n)之外的字符.
\r  : 表示回车
\n  : 表示换行
\t  : 表示TAB键
\w  : 表示字母,数字或下划线, 等同于[A-Za-z0-9_]
\W  : 表示非字母,数字或下划线, 等同于[^A-Za-z0-9_]
\s  : 表示空白字符, 等同于[ \f\n\r\t]
\S  : 表示非空白字符, 等同于[^ \f\n\r\t]
\d  : 表示数字字符, 等同于[0-9]
\D  : 表示非数字字符, 等同于[^0-9]

    当我们需要表示有特定意义的字符时,  可以用"\"来进行转义, 如要表示一对中括号, 就用"\[\]",其他的类似. 当"*", "+", ".", "(", ")", "$", "?", "|", "{"出现在中括号内时, 就只表示字符本身而没有其他含义.

    现在越来越记不住了, 就先记住这些吧.

Perl中的正则表达式起步之二

    单个字符的正则表达式作用有限, 但这是构造复杂的正则表达式的基础, 现在我们就来看一下如何将单个字符扩成多个字符.

| : 或者
* : 表示出现0个或多个
+ : 表示出现1个或多个
? : 表示出现0个或1个
{n} : 表示重复出现n次
{m,n} : 表示重复出现最少m次, 最多n次

    到这一部份就比较难理解了, 还是举例子来解释吧.

(ab|cd|ef) "ab", "cd", "ef"中的任一个
[a-zA-Z]+ 只包括字母的单词
[A-Z][a-z]* 第一个字母是大写的单词
\d+\.?\d* 表示一个数字
[a-z]{4} 四个小写字母
[+-]?\d*\.\d{1,6} 小数点后有1到6位的数
.|\n 任何字符
.* 一行
^\s*$ 空行

    看到这儿我又糊了, 需要多锻炼和体会了.

January 19, 2007

Perl中的正则表达式起步之三

    作为了一个DBA, 在接触了正则表达式后, 深深为其所打动, 利用正则表达式可以轻松地简化很多的工作, 并开发出别人刮目相看的工具. 下面简单地写几个例子:

    1, 在sed, grep, vi等工具中使用, 下面的例子是grep和vi中删除空行及用sed替换ALTER后面的一个单位为INDEX.

grep -v '^\s*$' cr.sql
egrep -v '^\s*$' cr.sql
vi: g/^\s*$/d
sed 's/ALTER [A-Z]+/ALTER INDEX/g' cr.sql

    2, 在Perl程序中使用, 可以用于字符串比较或替换, 下面的例子中将CREATE TABLE或INDEX语句中的表名替换掉, 就这一点用其他的语言来实现的话就要写很多的代码了.

$create_syntax = "CREATE TABLE OLD_TABLE(COL1 NUMBER)";
if ($create_syntax =~ m/CREATE (TABLE|INDEX)/ )
{
   print("Matched\n");
   $create_syntax =~ s/CREATE (\w+) (\w+)/CREATE $1 new_name/g;
}
print($create_syntax, "\n");

    3, 用于进行字段分隔, 下面的例子将用不同分隔符分隔的文本取出来.

my $line = "   col1 col2|col3#col4   ";
my @cols = ($line =~ /\s+(\w+)\s+(\w+)\|(\w+)#(\w+)\s+/ );
print($cols[0],"|",$cols[1],"|",$cols[2],"|",$cols[3], "\n");

$line = "col1 col2     col3    col4   ";
@cols = split '\s+', $line;
$"="|";
print "@cols\n";

    如此强大, 你还不学一学?

March 7, 2007

再见了, Java语言!

    几年以前, 曾经喜欢用Java写编写程序. 历时最长的一个程序是用Java写的数据库交互工具 -- AnySQL. 使用JDBC, 可以连接很多不同的关系数据库, 这是名字中的SQL这几个字段的来源. 又因为用Java写成, 可以运行在不同的操作和硬件平台上, 这是Any这几个字母的来源, 也为了宣传这个工具, 所以申请了AnySQL.net这个网址. 可现在我已经很少再对这个工具作修改了, 也很少再用Java来写工具了, 转向了C及Perl, 个人站点上的内容也不光是这个用Java写成的工具了, 事实上, 它所占的比重已经非常少了. 因此我个人和Java说, 再见了!

    这个断断续续维护了2年多时间的程序, 曾经让我对Java很有感情, 为了一个图形界面, 从AWT研究到SWing, 最后到Eclipse项目组搞出来的SWT. 可是, 当我两年前开始写MyDUL时, 发现Java是多么地不适合, 为了一个小小的程序, 必须要装一个越来越大的JRE环境, 而且可以很方便地使用反编译工具生成可读性很好的源代码, 于是我转向了C语言. 当我在工作中要写一些工具时, 发现Java是多么地不适合于作文本处理, 不适合和OS打交道, 因此我转向了Perl语言.

    抽屉里还放着几本几年前买的有关JSP的图书, 可是我的主页也不是用JSP写的, 而是基于PHP和Perl CGI的程序, 在最近这两年中, 除了微微地改动一下AnySQL工具外, 已经远离Java了. 我所要的程序的通用性已经可以从Perl中找到了. 当看着JRE越来越大时, 心中不爽的感觉越来越强!

    再见了, Java语言!

March 20, 2007

角本语言转型, 安装Windows上的Perl环境

    1, 安装Windows上的ActivePerl软件. 在下载后, 点击install.bat角本, 然后按照提示打Yes或No, 下面是将软件安装到c:\usr目录(因为Perl角本的第一行一般是/usr/bin/perl -w)下的例子:

Did you read the LICENSE.txt file? [no] yes
Do you agree to the ActivePerl Community License v2.1? [no] yes
Enter top level directory for install? [C:\Perl] c:\usr
Create shortcuts to the HTML documentation? [yes] no
Add the Perl\site\bin and Perl\bin directories to the PATH? [yes]
Create Perl file extension association? [yes]
Create IIS script mapping for Perl? [yes] no
Create IIS script mapping for Perl ISAPI? [yes] no
Proceed? [yes]

    2, 安装连接Oracle的模块DBD-Oracle 1.19, 下载后解压到c:\usr目录即可.

    3, 安装连接MySQL的模块DBD-MySQL, 运行c:\usr\bin目录下的ppm-shell.bat文件. 如果要从这儿安装DBD-Oracle, 则打install DBD-Oracle就可以了.

ppm> install dbd-mysql
Downloading ActiveState Package Repository packlist...done
Updating ActiveState Package Repository database...done
Downloading DBD-mysql-3.0002...done
Unpacking DBD-mysql-3.0002...done
Generating HTML for DBD-mysql-3.0002...done
Updating files in site area...done
  14 files installed
ppm>

    不过在ActivatePerl的站点上不能安装DBD-Sybase, DBD-MSSQL, DBD-DB2等包, 只能自已编译了.

上一页 1 2 3 4 5 6 7 8 9 10 11 下一页

当前分类: Developer

Creative Commons License
本站版权: 共用创作 CC
署名-非商业性-相同方式分享
本站基于MT-3.36免费版
(©)版权所有, 2004 - 2008, www.AnySQL.net, 保留所有权利.
MSN: loufangxin(a)msn.com, Mail: anysql(at)126.com/support(at)iamdba.com, Skype ID:anysql