站内公告 |
|
|
站点日历 | | << < 2010 - 09 > >> | | Su | Mo | Tu | We | Th | Fr | Sa | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | |
日志搜索 |
|
|
站点统计 |
日志: 257 篇 评论: 39027 篇 引用: 0 个 会员: 69 人 访问:5964246 次 建立: 2007-01-09
|
| + 本站LOGO + |
|
|
 |
|
Topics in Category: perl :: 1 |
浏览样式: 正常模式
| 列表模式 |
perl
|
perl常问问题集--第七篇 作者: 萧百龄 出处:两只老虎工作室 ( 5 ) 砖 ( 4 ) 好 评论 ( 0 ) 条 进入论坛 更新时间:2005-09-09 13:04 关 键 词:Perl 问题 阅读提示:perl常问问题集--第七篇,涵盖网路连线、 Internet ,还有几个关於 WWW 的问题。
我的 CGI script可在指令列下执行但无法从浏览器执行。您能不能帮我修修看? 当然,但您恐怕付不起雇我们的签约金 :-)
说真的,如果您能够先证明您已读过下列这几个 FAQs ,但遇到的问题并不单纯、非叁言两语即可回答的话,那麽您 post到 comp.infosystems.www.authoring.cgi上(如果是有关 HTTP 、 HTML ,或 CGI通信协定)的问题可能也会得到口气和缓而有用的答覆。表面上看似 Perl,但骨子里是 CGI之类的问题,如果 post到 comp.lang.perl.misc人家可能就不会这麽乐意地接受了。
几个实用的 FAQs 分别是:
http://www.perl.com/perl/faq/idiots-guide.html http://www3.pair.com/webthing/docs/cgi/faqs/cgifaq.shtml http://www.perl.com/perl/faq/perl-cgi-faq.html http://www-genome.wi.mit.edu/WWW/faqs/www-security-faq.html http://www.boutell.com/faq/ 【译者】上面第叁份文件,Perl-CGI-FAQ的中译版可在 http://2Ti.com/cgi-bin/2T/perl/perl-cgi-faq-chi/ 处取得。最後一份(WWW FAQ)的中译版可自 http://www.acer.net/document/cwwwfaq/ 取得。
--------------------------------------------------------------------------------
如何去除文章中的 HTML标签? 最正确(尽管不是最快)的方法是使用 HTML::Parse模组(可由 CPAN取得,是所有写 Web程式者必备的 libwww-perl 套件的一部分)。
许多人尝试用简陋的正规表示式来解决这个问题,譬如说像 s/<.*?>//g,但这个式子在很多情况下会失败,因为要处理的字串可能会跨越断行字元,也可能含有被 quote【跳脱】的箭头号,或有 HTML comment出现;再加上一些疏忽,譬如,人们常忘了转换如 <的 entities(跳脱字 元)。
以下这个「简陋」的方法对大多数的档案都有效:
#!/usr/bin/perl -p0777 s/<(?:[^>'"]*|(['"]).*?\1)*>//gs 如果您想要更完整的解法,请看叁部曲的 striphtml 程式, http://www.perl.com/CPAN/authors/Tom_Christiansen/scripts/striphtml.gz 。
--------------------------------------------------------------------------------
如何萃取 URLs? 一个快速但不完美的做法是
#!/usr/bin/perl -n00 # qxurl - tchrist@perl.com print "$2\n" while m{ < \s* A \s+ HREF \s* = \s* (["']) (.*?) \1 \s* > }gsix; 这个版本并不替相对式写法的 URLs 作调整,也不懂代换 bases【< LINK BASE=``...''>】,或如何处理 HTML comments、同时处理同一个标签里的 HREF和 NAME 属性,或接受 URL形式的参数。同时,它要比一个较「完整」、利用 LWP [libwww-perl]模组套件的解法,例如 http://www.perl.com/CPAN/authors/Tom_Christiansen/scripts/xurl.gz这个程 式,快上一百倍。
--------------------------------------------------------------------------------
如何从 user端上传资料?如何在另一台机器上开一个档案? 如果是 HTML表格的话,您可以使用 multipart/form-data的编码格式。 CGI.pm(可自 CPAN取得)中的 start_multipart_form()这个 method 就是为此设计的,它和 startform()这个 method 是两回事。
--------------------------------------------------------------------------------
如何在 HTML中做 pop-up menu(跳出式选单)? 用 <select> 和 <OPTION>这两个标签。 CGI.pm模组(可由 CPAN取得)对这个 widget【此指跳出式选单这个介面成分】还有许多其他的介面成分都有支援【即有制作动态标签的函式】,其中有些是以巧妙模拟的方 式达成。
--------------------------------------------------------------------------------
如何抓 HTML档案? 有一个方法是,如果您的系统上装有 lynx一类的文字模式的 HTML浏览器的话,那麽可以这麽做:
$html_code = `lynx -source $url`; $text_data = `lynx -dump $url`; 收录在 CPAN里的 libwww-perl (LWP)模组则提供了更强的方法来做这件事。它不但可钻过 proxies,而且也不需要 lynx:
# print HTML from a URL use LWP::Simple; getprint "http://www.sn.no/libwww-perl/";; # print ASCII from HTML from a URL use LWP::Simple; use HTML::Parse; use HTML::FormatText; my ($html, $ascii); $html = get("http://www.perl.com/";); defined $html or die "Can't fetch HTML from http://www.perl.com/";; $ascii = HTML::FormatText->new->format(parse_html($html)); print $ascii;
--------------------------------------------------------------------------------
如何解开或产生 Web上那些冠 %的码? 以下是一个解码的实例:
$string = "http://altavista.digital.com/cgi-bin/query?pg=q&;what=news&fmt=.&q=%2Bcgi-bin+%2Bperl.exe"; $string =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge; 编码比较困难一点,因为您不能盲目地把所有非字母数字的字元 (\W)都一律转换成十六进位的跳脱码。很重要的是有特殊意义的字元,如 / 和 ? 便不可以 转换。要做得正确,最简单的方法大概是使用现成的 URI::Escape模组,而不要重新发明轮子。这个模组是 libwww-perl 套件 (LWP)的一部分,可自 CPAN取得。
--------------------------------------------------------------------------------
如何【将 requests】转向到另一页去? 在您的回应中不要使用 Content-Type这个标头,相反地,用 Location: 这个标头。按正式规定,应当 URL: 才是正确的标头。因此 CGI.pm模组(可 由CPAN取得)两个标头都送:
Location: http://www.domain.com/newpage URI: http://www.domain.com/newpage 要注意的是,由於 servers采用「最高效率化」的运作方式,故在这些标头中如 果使用相对式的 URLs可能会产生奇怪的後果。
--------------------------------------------------------------------------------
如何替网页加上密码? 不一定,要看情况。您需要读您 server的使用手册,或者查查看上头所列的几个 FAQs。
--------------------------------------------------------------------------------
要怎麽用 Perl来编辑 .htpasswd和 .htgroup这两个档案? HTTPD::UserAdmin 和 HTTPD::GroupAdmin等模组为这些档案提供了统一的物件导向介面,尽管这些档案可能以各种不同的格式储存。这些资料库可能是纯文字格式、 dbm、Berkeley DB或任何 DBI相容的资料库驱动程式 (drivers)。 HTTPD::UserAdmin支援`Basic' 和 `Digest'这两个认证模式所用的档案。以下是 一例:
use HTTPD::UserAdmin (); HTTPD::UserAdmin ->new(DB => "/foo/.htpasswd") ->add($username => $password);
--------------------------------------------------------------------------------
如何防范使用者藉由填我的 CGI表格来做坏事? 阅读 CGI security FAQ,(可在 http://www-genome.wi.mit.edu/WWW/faqs/www-security-faq.html取得),还有 Perl CGI FAQ,在 http://www.perl.com/CPAN/doc/FAQs/cgi/perl-cgi-faq.html 。
简单一句话:使用 tainting(沾腥?)这项功能(详见 perlsec )。它会让所有不在您的 script中、来路不明的资料(譬如, CGI参数)无法放到 eval 或 system等呼叫中使用。除了使用 tainting之外,绝对不要使用单一参数 的方式下参数给 system()或 exec(),而应将欲执行的指令及其参数放在一个序 列或阵列里面,再传给 system()或 exec(),这样便可避免 globbing【即被 shell先做解译】。
--------------------------------------------------------------------------------
如何解读、萃取 email标头资料? 如果您只需要一个「快而脏」的解法的话,您可以试试这个从再版的 ``Programming Perl''第 222页中拿出来的例子:
$/ = ''; $header = <MSG>; $header =~ s/\n\s+/ /g; #将延续行合并成单行 %head = ( UNIX_FROM_LINE, split /^([-\w]+):\s*/m, $header ); 譬如说,您若想保留所有 Received栏位资料的话【因 Received栏位通常不止一个】,这个解法便不太行了。一个完整的解法是使用收录在 CPAN的 Mail::Header模组( MailTools 套件的一部分)。
--------------------------------------------------------------------------------
如何解译 CGI表格? 很多人忍不住要自己写程式来处理这部分的工作,所以您们大概都看过一大堆其中有 $ENV{CONTENT_LENGTH} 和 $ENV{QUERY_STRING}的程式码。没错,这麽 写是可以行得通,但事实上也有很多在网路上出没的这类程式根本不能用!
请不要忍不住去重新发明轮子【译者:这是英文的说法 (reinventing the wheels),也就是浪费时间做人家做过的事的意思】。请改用 CGI.pm或 CGI_Lite.pm(可自 CPAN取得)。如果您被困在无模组的 perl1 .. perl4的土地上,您可以试看看 cgi-lib.pl(可至 http://www.bio.cam.ac.uk/web/form.html取得)。
--------------------------------------------------------------------------------
如何验证 email位址? 无法度。
如果没有寄封信到一个位址去试试看它会不会弹回来(即使是这麽做您还得面对停顿的问题),您是无法确定一个位址是否真的存在的。即使您套用 email 标头的标准规格来做检查的依据,您还是有可能会遇到问题,因为有些送得到的位址并不 符合 RFC-822(电子邮件标头的标准)的规定,但有些符合标准的位址却无法投 递。
许多人试图用一个简单的正规表示式,例如 /^[\w.-]+\@([\w.-]\.)+\w+$/来消除一些通常是无效的 email位址。不过,这样做也把很多合格的位址给一起滤掉了,而且对测试一个位址有没有希望投递成功完全没有帮助,所以在此建议大家不要这麽做;不过您可以看看: http://www.perl.com/CPAN/authors/Tom_Christiansen/scripts/ckaddr.gz。这个 script真的彻底地依据所有的 RFC规定来做检验(除了内嵌式 comments外),同时会排除一些您可能不会想送信去的位址(如 Bill Clinton【美国柯林顿总统】或您的 postmaster),然後它会确定位址中的主机名称可在 DNS中找得到。这个 script 跑起来不是很快,但至少有效。
不少 CGI scripts的作者使用另一个替代的方案:用一个简单的正规表示式,(如上头的那个)。如果一个位址能让这个式子对得上的话,那麽就接受这个位址。如果这个位址对不上这个式子的话,便再向使用者讯问,以确定她们填入的这个位 址正确无误。
--------------------------------------------------------------------------------
如何解 MIME/BASE64字串? MIME-tools套件(可自 CPAN取得)不但可处理这个问题而且有许多其他的功能。有了这个套件,解 BASE64码就变得像这麽容易:
use MIME::base64; $decoded = decode_base64($encoded); 一个比较直接的解法是先做一点简单的转译,然後使用 unpack()这个函数的 ``u'' 格式:
tr#A-Za-z0-9+/##cd; #去除非 base64字元 tr#A-Za-z0-9+/# -_#; #转换成 uu码格式 $len = pack("c", 32 + 0.75*length); #计算长度字元 print unpack("u", $len . $_); # uu解码後 print
--------------------------------------------------------------------------------
如何根据使用者帐户名称自动合成 email位址? 在支援 getpwuid【UNIX系统呼叫】、 $<这个变数,和 Sys::Hostname模组(标准 perl 发行的一部分)的系统上,您可试试这样的做法:
use Sys::Hostname; $address = sprintf('%s@%s', getpwuid($<), hostname); 有的公司对 email位址有统筹规画,因此这麽一来您可能会合成出不被公司的 email 主机接受的位址。所以如果有这类的顾虑的话,您应该直接向 users要他们的 email 位址。 而且,并不是所有能跑 Perl的系统都像 Unix一样,可以很容易得到这些资料。
CPAN里的 Mail::Util模组( MailTools 套件的一部分)中有一个 mailaddress()函数,它会试着去猜 user的 email位址。这个函数使用比上面的 code聪明的方法,它会参考安装时所得到的设定资料,但是错误仍可能发生。所以,再一次地,最好的方法通常是直接问 user 本人。
--------------------------------------------------------------------------------
我的程式如何送/读 email? 送信:CPAN 上头的 Mail::Mailer模组( MailTools套件的一部分)只适合在 Unix 上使用,但利用到 Net::SMTP的 Mail::Internet模组则没有这个限制。 读信:用 CPAN 上的 Mail::Folder模组( MailFolder 套件的一部分)或是用 CPAN 上头的 Mail::Internet模组( 也是 MailTools 套件的一部分)。
#送信 use Mail::Internet; use Mail::Header; #设定使用哪台主机 $ENV{SMTPHOSTS} = 'mail.frii.com'; #制作标头 $header = new Mail::Header; $header->add('From', 'gnat@frii.com'); $header->add('Subject', 'Testing'); $header->add('To', 'gnat@frii.com'); #制作本文 $body = 'This is a test, ignore'; #产生 mail物件 $mail = new Mail::Internet(undef, Header => $header, Body => \[$body]); #送出 $mail->smtpsend or die;
--------------------------------------------------------------------------------
如何找出我的主机名/网域名/IP位址? 长久以来许多 code都很草率地直接呼叫 `hostname`这个程式来取得主机名。 虽然这麽做很方便,但也同时增加了移植到其他平台上的困难。这是一个很典型的 例子,在方便和可移植性之间作抉择,不论选哪一边,必须付出一些牺牲和代价。
Sys::Hostname这个模组(标准 perl发行的一部分)可用来取得机器的名字,然後您便可利用 gethostbyname()这个系统呼叫来找出该机的 IP位址了(假定您的 DNS 运作正常)。
use Socket; use Sys::Hostname; my $host = hostname(); my $addr = inet_ntoa(scalar(gethostbyname($name || 'localhost'))); 至少在 Unix底下,取得 DNS网域名最简单的方法大概要算是直接从 /etc/resolv.conf这个档案里面找。当然,这麽做的前提是 resolv.conf这个档 案的设定必须照惯例的格式,还有就是这个档案必先存在才行。
(Perl在非 Unix系统下尚需要一有效的方法来测出机器和网域名)
--------------------------------------------------------------------------------
如何抓新闻讨论群的文章或群组名录? 使用 Net::NNTP或 News::NNTPClient模组,两者皆可自 CPAN下载。这些模组 让抓群组名录这类的差事变得这麽容易:
perl -MNews::NNTPClient -e 'print News::NNTPClient->;new->list("newsgroups")'
--------------------------------------------------------------------------------
如何抓/丢 FTP档案? LWP::Simple模组(可自 CPAN下载)可以抓,但不能丢档案。 Net::FTP模组(也可自 CPAN下载)虽比较复杂,但可用来丢、也能抓档案。
--------------------------------------------------------------------------------
如何用 Perl做 RPC? 有一个 DCE::RPC模组正在发展阶段(但尚未完成)。一旦完成後它会随着 DCE-Perl这个套件发行(可由 CPAN 下载)。至於 ONC::RPC这样的模组则还没听说有人在发展。
更多请点击http://developer.51cto.com/art/200509/2645.htm
|
|
作者:
qiuqiu | 分类:
perl |
评论: 0
|
引用: 0
| 浏览: 974 |
日期函数
|
$year = (gmtime time)[5] + 1900; $month = (gmtime time)[4] + 1; $date = (gmtime time)[3]; $today = $year."-".$month."-".$date;
|
|
作者:
qiuqiu | 分类:
perl |
评论: 0
|
引用: 0
| 浏览: 250 |
安装 perl
|
linux 和 perl 都属于自由软件,将二者结合真是妙不可言。 遵循以下步骤一般就可安装好 perl ,perl 就能在 linux 下欢唱。
1。取得最新版本的 perl,当前版本为 5.6.0,即 stable.tar.gz。
2。解文件包: gunzip stable.tar.gz tar xvf stable.tar 得到目录 perl-5.6.0
3。在目录 perl-5.6.0 下安装 perl: rm -f config.sh Policy.sh sh Configure -de make make test make install config.sh Policy.sh 为以前安装时的配置文件,新安装或升级安装时需要将其删除。 sh Configure -de 安装使用默认配置,一般而言将会 ok 。 安装完成后 perl 所在目录为 /usr/local/lib/perl5, perl 执行文件 在 /usr/local/bin 中。
4。关于 .html 文件 安装 perl 时不能自动安装 .html 文件, 在 perl-5.6.0 目录中有一 个installhtml 文件, 执行 perl installhtml --help 可得到使用帮助,使用 installhtml可将 .pod 及 .pm 文件编译得到相应的 .html 文件文件, 它的具 体使用请自己看。 下面是我所写的一个具有类似功能的程序。
simple_find("5.6.0");# 含 .pm 文件的源目录 use Pod::Html; sub simple_find{ $sourth="/usr/local/lib/perl5/5.6.0html/"; #含 .html的目标目录 my ($input)=@_; my $file; $ddir=$sourth.$input; $cont=`file $ddir`; if ($cont !~/$ddir:sdirectory/){ `mkdir $ddir`; } opendir(md,$input); my @file=readdir(md); closedir(md);
@pfile= grep(m/.pm/,@file); my @dfile= grep(!m/.pm/,@file); @dfile=grep(!m/^./,@dfile);
foreach $pfile(@pfile){ $pfile=~/.pm/; $dfile=$`; $sfile=$input."/".$pfile; $dfile=$sourth.$input."/".$dfile.".html"; pod2html( "--infile=$sfile", "--outfile=$dfile"); } foreach $file(@dfile){ $vale=$input."/".$file; $cont=`file $vale`; if ($cont=~/$vale:sdirectory/){ simple_find($vale); } } } 使用以上程序得到一个与源目录结构一致的目标目录,包含相应的. html文件。 注: 使用以上两种方法都会产生不能转化某行类错误,其实它无关大局,可以忽略。
5。模块安装 gunzip Module.tar.gz tar xvf Moudle.tar 转到相应目录 perl Makefile.PL make make test make install 安装完成后模块在 /usr/local/lib/perl5/site_perl 目录中, . html 文件不能自动安装,需使用前面介绍方法进行安装。
|
|
作者:
qiuqiu | 分类:
perl |
评论: 0
|
引用: 0
| 浏览: 22123 |
正则表达式
|
正则表达式的三种形式 首先我们应该知道 Perl 程序中,正则表达式有三种存在形式,他们分别是:
匹配:m/<regexp>/ (还可以简写为 /<regexp>/ ,略去 m)
替换:s/<pattern>/<replacement>/
转化:tr/<pattern>/<replacemnt>/
这三种形式一般都和 =~ 或 !~ 搭配使用(其中 "=~" 表示相匹配,在整条语句中读作 does,"!~" 表示不匹配,在整条语句中读作 doesn't),并在左侧有待处理的标量变量。如果没有该变量和 =~ !~ 操作符,则默认为处理 $_ 变量中的内容。举例如下:
$str = "I love Perl";
$str =~ m/Perl/; # 表示如果在 $str 中发现 "Perl" 字符串,则返回 "1" 否则返回 "0"。
$str =~ s/Perl/BASH/; # 表示将变量 $str 中的 "Perl" 字符串替换为 "BASH",如果发生此替换则返回 "1",否则返回 "0"。
$str !~ tr/A-Z/a-z/; # 表示将变量 $str 中的所有大写字母转化为小写字母,如果转化发生了则返回 "0",否则返回 "1"。
另外还有:
foreach (@array) { s/a/b/; } # 此处每次循环将从 @array 数组中取出一个元素存放在 $_ 变量中,并对 $_ 进行替换处理。
while (<FILE>) { print if (m/error/); } # 这一句稍微复杂一些,他将打印 FILE 文件中所有包含 error 字符串的行。
Perl 的正则表达式中如果出现 () ,则发生匹配或替换后 () 内的模式被 Perl 解释器自动依次赋给系统 $1, $2 ...... 请看下面的例子:
$string = "I love perl";
$string =~ s/(love)/<$1>/; # 此时 $1 = "love",并且该替换的结果是将 $string 变为 "I <love> perl"
$string = "i love perl";
$string =~ s/(i)(.*)(perl)/<$3>$2<$1>/; # 这里 $1 = "i",$2 = " love ",$3 = "perl",并且替换后 $string 变为 "<perl> love <i>"
替换操作 s/<pattern>/<replacement>/ 还可以在末尾加上 e 或 g 参数,他们的含义分别为:
s/<pattern>/<replacement>/g 表示把待处理字符串中所有符合 <pattern> 的模式全部替换为 <replacement> 字符串,而不是只替换第一个出现的模式。
s/<pattern>/<replacement>/e 表示将把 <replacemnet> 部分当作一个运算符,这个参数用的不多。
比如下面的例子:
$string = "i:love:perl";
$string =~ s/:/*/; #此时 $string="i*love:perl";
$string = "i:love:perl";
$string =~ s/:/*/g; #此时 $string="i*love*perl";
$string =~ tr/*/ /; #此时 $string="i love perl";
$string = "www22cgi44";
$string =~ s/(\d+)/$1*2/e; # (/d+)代表 $string 中的一个或多个数字字符,将这些数字字符执行 *2 的操作,因此最后 $string 变成了 "www44cgi88"。
下面给出一个完整的例子:
#!/usr/bin/perl
print"请输入一个字符串!\n";
$string = <STDIN>; # <STIDN>代表标准输入,会让使用者输入一字符串
chop($string); # 将$string最后一个换行的字符\n删除掉
if($string =~ /perl/){
print("输入的字符串中有 perl 这个字符串!\n";
}
如果输入的字符串含有 perl 这个字符串的话,就会显示后面的提示信息。
2 正则表达式中的常用模式 下面是正则表达式中的一些常用模式。
/pattern/ 结果 . 匹配除换行符以外的所有字符 x? 匹配 0 次或一次 x 字符串 x* 匹配 0 次或多次 x 字符串,但匹配可能的最少次数 x+ 匹配 1 次或多次 x 字符串,但匹配可能的最少次数 .* 匹配 0 次或一次的任何字符 .+ 匹配 1 次或多次的任何字符 {m} 匹配刚好是 m 个 的指定字符串 {m,n} 匹配在 m个 以上 n个 以下 的指定字符串 {m,} 匹配 m个 以上 的指定字符串 [] 匹配符合 [] 内的字符 [^] 匹配不符合 [] 内的字符 [0-9] 匹配所有数字字符 [a-z] 匹配所有小写字母字符 [^0-9] 匹配所有非数字字符 [^a-z] 匹配所有非小写字母字符 ^ 匹配字符开头的字符 $ 匹配字符结尾的字符 \d 匹配一个数字的字符,和 [0-9] 语法一样 \d+ 匹配多个数字字符串,和 [0-9]+ 语法一样 \D 非数字,其他同 \d \D+ 非数字,其他同 \d+ \w 英文字母或数字的字符串,和 [a-zA-Z0-9] 语法一样 \w+ 和 [a-zA-Z0-9]+ 语法一样 \W 非英文字母或数字的字符串,和 [^a-zA-Z0-9] 语法一样 \W+ 和 [^a-zA-Z0-9]+ 语法一样 \s 空格,和 [\n\t\r\f] 语法一样 \s+ 和 [\n\t\r\f]+ 一样 \S 非空格,和 [^\n\t\r\f] 语法一样 \S+ 和 [^\n\t\r\f]+ 语法一样 \b 匹配以英文字母,数字为边界的字符串 \B 匹配不以英文字母,数值为边界的字符串 a|b|c 匹配符合a字符 或是b字符 或是c字符 的字符串 abc 匹配含有 abc 的字符串 (pattern) () 这个符号会记住所找寻到的字符串,是一个很实用的语法。第一个 () 内所找到的字符串变成 $1 这个变量或是 \1 变量,第二个 () 内所找到的字符串变成 $2 这个变量或是 \2 变量,以此类推下去。 /pattern/i i 这个参数表示忽略英文大小写,也就是在匹配字符串的时候,不考虑英文的大小写问题。 \ 如果要在 pattern 模式中找寻一个特殊字符,如 "*",则要在这个字符前加上 \ 符号,这样才会让特殊字符失效
下面给出一些例子:
范例 说明 /perl/ 找到含有 perl 的字符串 /^perl/ 找到开头是 perl 的字符串 /perl$/ 找到结尾是 perl 的字符串 /c|g|i/ 找到含有 c 或 g 或 i 的字符串 /cg{2,4}i/ 找到 c 后面跟着 2个到 4个 g ,再跟着 i 的字符串 /cg{2,}i/ 找到 c 后面跟着 2个以上 g ,再跟着 i 的字符串 /cg{2}i/ 找到 c 后面跟着 2个 g,再跟着 i 的字符串 /cg*i/ 找到 c 后面跟着 0个或多个 g ,再跟着 i 的字符串,如同/cg{0,1}i/ /cg+i/ 找到 c 后面跟着一个以上 g,再跟着 i 的字符串,如同/cg{1,}i/ /cg?i/ 找到 c 后面跟着 0个或是 1个 g ,再跟着 i 的字符串,如同/cg{0,1}i/ /c.i/ 找到 c 后面跟着一个任意字符,再跟着 i 的字符串 /c..i/ 找到 c 后面跟着二个任意字符,再跟着 i 的字符串 /[cgi]/ 找到符合有这三个字符任意一个的字符串 /[^cgi]/ 找到没有这三个字符中任意一个的字符串 /\d/ 找寻符合数字的字符,可以使用/\d+/来表示一个或是多个数字组成的字符串 /\D/ 找寻符合不是数字的字符,可以使用/\D+/来表示一个或是更多个非数字组成的字符串 /\*/ 找寻符合 * 这个字符,因为 * 在常规表达式中有它的特殊意思,所以要在这个特殊符号前加上 \ 符号,这样才会让这个特殊字符失效 /abc/i 找寻符合 abc 的字符串而且不考虑这些字符串的大小写
3 正则表达式的八大原则 如果在 Unix 中曾经使用过 sed、awk、grep 这些命令的话,相信对于 Perl 语言中的正则表达式(Regular Expression)不会感到陌生。Perl 语言由于有这个功能,所以对字符串的处理能力非常强。在Perl语言的程序中,经常可以看到正则表达式的运用,在 CGI 程序设计中也不例外。
正则表达式是初学 Perl 的难点所在,不过只要一旦掌握其语法,你就可以拥有几乎无限的模式匹配能力,而且 Perl 编程的大部分工作都是掌握常规表达式。下面给大家介绍几条正则表达式使用过程中的 8 大原则。
正则表达式在对付数据的战斗中可形成庞大的联盟——这常常是一场战争。我们要记住下面八条原则:
· 原则1:正则表达式有三种不同形式(匹配(m/ /),替换(s/ / /eg)和转换(tr/ / /))。
· 原则2:正则表达式仅对标量进行匹配( $scalar =~ m/a/; 可以工作; @array =~ m/a/ 将把@array作为标量对待,因此可能不会成功)。
· 原则3:正则表达式匹配一个给定模式的最早的可能匹配。缺省时,仅匹配或替换正则表达式一次( $a = 'string string2'; $a =~ s/string/ /; 导致 $a = 'string 2')。
· 原则4:正则表达式能够处理双引号所能处理的任意和全部字符( $a =~ m/$varb/ 在匹配前把varb扩展为变量;如果 $varb = 'a' $a = 'as',$a =~ s/$varb/ /; 等价于 $a =~ s/a/ /; ,执行结果使 $a = " s" )。
· 原则5:正则表达式在求值过程中产生两种情况:结果状态和反向引用: $a=~ m/pattern/ 表示 $a 中是否有子串 pattern 出现,$a =~ s/(word1)(word2)/$2$1/ 则"调换"这两个单词。
· 原则6:正则表达式的核心能力在于通配符和多重匹配运算符以及它们如何操作。$a =~ m/\w+/ 匹配一个或多个单词字符;$a =~ m/\d/" 匹配零个或多个数字。
· 原则7:如果欲匹配不止一个字符集合,Perl使用 "|" 来增加灵活性。如果输入 m/(cat|dog)/ 则相当于"匹配字符串 cat 或者 dog。
· 原则8:Perl用 (?..) 语法给正则表达式提供扩展功能。(这一点请同学们课后看相关资料)
想要学习所有这些原则?我建议大家先从简单的开始,并且不断的尝试和实验。实际上如果学会了 $a =~ m/ERROR/ 是在 $a 中查找子串ERROR,那么你就已经比在 C 这样的低层语言中得到了更大的处理能力。
|
|
作者:
qiuqiu | 分类:
perl |
评论: 0
|
引用: 0
| 浏览: 11961 |
|
|
 |
 |