??xml version="1.0" encoding="utf-8" standalone="yes"?>一本色道久久综合亚洲精品婷婷,欧美freesex交免费视频,日韩三级中文字幕http://www.aygfsteel.com/weidagang2046/category/8050.html物格而后知致zh-cnWed, 28 Feb 2007 02:01:36 GMTWed, 28 Feb 2007 02:01:36 GMT60l计工程的源代码行数http://www.aygfsteel.com/weidagang2046/articles/81406.htmlweidagang2046weidagang2046Wed, 15 Nov 2006 15:56:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/81406.htmlhttp://www.aygfsteel.com/weidagang2046/comments/81406.htmlhttp://www.aygfsteel.com/weidagang2046/articles/81406.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/81406.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/81406.html 

$pattern_h   =   ' D:/work/ChineseChess/*.h ' ;
$pattern_cpp   =   ' D:/work/chineseChess/*.cpp ' ;

$count   =   0 ;

@h   =   glob ( $pattern_h );
@cpp   =   glob ( $pattern_cpp );

foreach   $file  ( @h )
{
    
open (FILE ,   $file );
    
    
while  ( $line   =   < FILE > )
    {
        
$count ++ ;
    }
}

foreach   $file  ( @cpp )
{
    
open (FILE ,   $file );
    
    
while  ( $line   =   < FILE > )
    {
        
$count ++ ;
    }
}

print   $count ,   " \n "


weidagang2046 2006-11-15 23:56 发表评论
]]>
Perl eval函数探讨http://www.aygfsteel.com/weidagang2046/articles/66028.htmlweidagang2046weidagang2046Sun, 27 Aug 2006 13:03:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/66028.htmlhttp://www.aygfsteel.com/weidagang2046/comments/66028.htmlhttp://www.aygfsteel.com/weidagang2046/articles/66028.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/66028.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/66028.html 2006-8-27

 

Perl 作ؓ一U脚本语a可以实时地生成和执行代码。这U特性可以把代码的编译推q到q行Ӟ所以又UCؓ“动态代码”。另外, Perl 也如 Java ?/span> C++ 一h供了异常处理机制。本文将初步探讨 Perl 中实现动态代码和异常处理机制的函敎ͼ eval 。如有错误不IƢ迎讨论和批评指正?/span>

 

eval 函数可以看作?/span> Perl 虚拟机,它的参数是一D?/span> Perl 代码。利?/span> ’perldoc –f eval?/font> 可以获取 eval 函数使用帮助Q其中介l了它的两种使用方式Q?/span>

 

l         eval EXPR

EXPR 是一个的表达式,例如Q?/span>

eval "print $a" ;

eval 'print $a' . ', $b' ;

eval 1 + 3 ;

eval 'print ' . '$a + $b, "\n"' ;

eval $command;#$command = ‘print “hello Perl”?/span>

eval $ARGV[0];

在执行时Q?/span> Perl 解释器会首先解析表达式的|然后表辑ּgZ?/span> Perl 语句插入当前执行上下文。所以,新生成的语句?/span> eval 语句本nh相同的上下文环境。这U方式中Q每ơ执?/span> eval 语句Q表辑ּ都会被解析。所以,如果 eval EXPR 如果出现在@环中Q表辑ּ可能会被解析多次?/span> eval 的这U方式?/span> Perl 脚本E序能实时生成和执行代码Q从而实C“动态代码”?/span>

 

l         eval BLOCK

BLOCK 是一个代码块Q例如:

eval {print $a};

eval {$a = 1, $b = 2, $c = $a + $b};

与第一U方式不同, BLOCK 只会被解析一ơ,然后整个插入当前 eval 函数所在的执行上下文。由于解析上的性能的优势,以及可以在编译时q行代码语法查,q种方式通常被作?/span> Perl 用来ZD代码提供异常捕捉机Ӟ虽然前一U方式也可以?/span>

 

按帮助的名称Q称 eval 的参数程序ؓ“小E序?/span> (mini-proggram) 。在两种方式中, eval 函数的返回值都是小E序的最后一条语句的|如果遇到 return 语句Q与子例E相同?/span>

Script1:

#!/usr/bin/perl -w

 

push ( @program,'$i = 1;');

push ( @program,'$i = 3; $j = 2; $k = $i + $j');

push ( @program, '$i = 3; return 24; $k = $i + $j');

 

foreach $exp (@program)

{

    $rtn =eval($exp);

    print $rtn,"\n";

}

Output:

1

5

24

 

如果程序中有语法错误、运行时错误遇到 die 语句Q?/span> eval 返?/span> undef 。错误码被保存在 $@ 中?/span>

Script2:

#!/usr/bin/perl -w

 

push ( @program, '$i = 3; die "error message"; $k = $i + $j');

 

foreach $exp (@program)

{

    $rtn =eval($exp);

    if ( ! defined ( $rtn))

    {

       print "Exception: " , $@,"\n";

    }

    else

    {

       print $rtn,"\n";

    }

} ;

 

Output:

Exception: error message at (eval 1) line 1.

 

 

Script3:

#!/usr/bin/perl -w

 

# a run-time error

eval '$answer =' ;   # sets $@

warn $@ if$@;

 

Output:

syntax error at (eval 1) line 2, at EOF

 



weidagang2046 2006-08-27 21:03 发表评论
]]>
如何捕捉CGIE序exceptionhttp://www.aygfsteel.com/weidagang2046/articles/65888.htmlweidagang2046weidagang2046Sat, 26 Aug 2006 01:07:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/65888.htmlhttp://www.aygfsteel.com/weidagang2046/comments/65888.htmlhttp://www.aygfsteel.com/weidagang2046/articles/65888.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/65888.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/65888.html用perl写cgiE序的时候,如果出现了问题,大多数都必须查看Web server的日志才能知道程序哪里出了错误,面一般只q回500服务器错误,不能立刻获得错误的原因?/p>

使用php的程序员没有这个烦|因ؓphp默认会将错误都打印到面上。CGIE序里如何才能做到这一点呢Q?/p>

CGI::Carpq个模块支持q个功能Q以下是例子Q?/p>

				
						use CGI::Carp qw(fatalsToBrowser);
die "Bad error here";
		

详细请参?a >CGI::Crap的在U手?/p>

那如果是自己写的单CGIE序Q不使用CGI.pm怎么办?以下是简单的Ҏ......

原理q?/h4>Perl 提供?SIG q个Ҏ的HASHQ通过定义信号响应函数Q可以捕捉die及一些warning的信息,q将q些信息打印到web上。但Z可能早的加载这些代码,最好将信号捕捉代码攑ֈBEGIN块中Q这样就能保证程序一执行先执行异常捕捉q段代码了?
BEGIN {
     # fatal handler setting.
     $SIG{__DIE__} = $SIG{__WARN__} = \&some_func;
}

代码例子

以下是一个简单的例程Q定义了一个叫handler_fatal处理函数来处理意外错误信息?
#!/usr/bin/perl -wuse strict

BEGIN {
     # fatal handler setting.
     $SIG{__DIE__} = $SIG{__WARN__} = \&handler_fatal;
}
# some perl code goes here
......

sub handler_fatal {
     print "Content-type: text/html\n\n";
     print "@_";
}

上面q段perlE序中,如果调用一个名UCؓabc();的子例程Q浏览器看到如下的错误信息Q?/p>

Undefined subroutine &main::abc called at /home/hzqbbc/cgi-bin/fatal.cgi line 8.

通过q个Ҏ可以很便的q行E序调试了。Extmail中的CGI.pm是使用cM的方法,可以捕捉die(), warn() {函C生的错误及系l的错误提示?br />
from: http://www.hzqbbc.com/blog/arch/2005/05/aecgicexception.html



weidagang2046 2006-08-26 09:07 发表评论
]]>
创徏或删除目?/title><link>http://www.aygfsteel.com/weidagang2046/articles/65250.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Wed, 23 Aug 2006 04:50:00 GMT</pubDate><guid>http://www.aygfsteel.com/weidagang2046/articles/65250.html</guid><wfw:comment>http://www.aygfsteel.com/weidagang2046/comments/65250.html</wfw:comment><comments>http://www.aygfsteel.com/weidagang2046/articles/65250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/weidagang2046/comments/commentRss/65250.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/weidagang2046/services/trackbacks/65250.html</trackback:ping><description><![CDATA[ <font face="Verdana"> <font size="2">File::Path module中的Q?br /><br /><span id="wmqeeuq" class="i">mkpath</span><span id="wmqeeuq" class="s">(</span><span id="wmqeeuq" class="s">[</span><span id="wmqeeuq" class="q">'/foo/bar/baz'</span><span id="wmqeeuq" class="cm">,</span><span id="wmqeeuq" class="q">'blurfl/quux'</span><span id="wmqeeuq" class="s">]</span><span id="wmqeeuq" class="cm">,</span><span id="wmqeeuq" class="n">1</span><span id="wmqeeuq" class="cm">,</span><span id="wmqeeuq" class="n">0711</span><span id="wmqeeuq" class="s">)</span><span id="wmqeeuq" class="sc">;</span><br /><span id="wmqeeuq" class="i">rmtree</span><span id="wmqeeuq" class="s">(</span><span id="wmqeeuq" class="s">[</span><span id="wmqeeuq" class="q">'foo/bar/baz'</span><span id="wmqeeuq" class="cm">,</span><span id="wmqeeuq" class="q">'blurfl/quux'</span><span id="wmqeeuq" class="s">]</span><span id="wmqeeuq" class="cm">,</span><span id="wmqeeuq" class="n">1</span><span id="wmqeeuq" class="cm">,</span><span id="wmqeeuq" class="n">1</span><span id="wmqeeuq" class="s">)</span><span id="wmqeeuq" class="sc">;</span></font> </font> <img src ="http://www.aygfsteel.com/weidagang2046/aggbug/65250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/weidagang2046/" target="_blank">weidagang2046</a> 2006-08-23 12:50 <a href="http://www.aygfsteel.com/weidagang2046/articles/65250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Perl Tips 2006/8/19http://www.aygfsteel.com/weidagang2046/articles/64542.htmlweidagang2046weidagang2046Sat, 19 Aug 2006 11:39:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/64542.htmlhttp://www.aygfsteel.com/weidagang2046/comments/64542.htmlhttp://www.aygfsteel.com/weidagang2046/articles/64542.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/64542.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/64542.html2 Perl language tips are met today.

1. a code snippet is as follows:
 
$code[$idx] =~ /^\s*(.+?)\s*$/;
$code[$idx] = $1;

Seem it's to extract the content without leading and tailing white space. But the (.+?) is still not understood.

2. a code snippet is as follows:

my $currentframe;
$currentframe = {
 _pc_ => 0,
 _func_ => 'main'
 };

what's the type of $currentframe? handle to a hashtable? 


Answer: $currentframe is a reference to an anonymous hash. Usage: $$currentframe{_pc_} or $currentframe->{_pc_}

weidagang2046 2006-08-19 19:39 发表评论
]]>删除用通配W匹配的一cL?/title><link>http://www.aygfsteel.com/weidagang2046/articles/64224.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Thu, 17 Aug 2006 15:28:00 GMT</pubDate><guid>http://www.aygfsteel.com/weidagang2046/articles/64224.html</guid><wfw:comment>http://www.aygfsteel.com/weidagang2046/comments/64224.html</wfw:comment><comments>http://www.aygfsteel.com/weidagang2046/articles/64224.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/weidagang2046/comments/commentRss/64224.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/weidagang2046/services/trackbacks/64224.html</trackback:ping><description><![CDATA[ <font face="Verdana"> <span style="FONT-SIZE: 13px">unlink 可以用通配W?br /><br />       unlink LIST<br />       unlink  Deletes a list of files.  Returns the number of files success-<br />               fully deleted.<br /><br />                   $cnt = unlink ’a? ’b? ’c?<br />                   unlink @goners;<br />                   <strong><font color="#cc0000">unlink <*.bak>;</font></strong><br /><br />               Note: "unlink" will not delete directories unless you are supe-<br />               ruser and the -U flag is supplied to Perl.  Even if these con-<br />               ditions are met, be warned that unlinking a directory can<br />               inflict damage on your <font color="#000000">filesystem</font>.  Use "rmdir" instead.<br /><br />               If LIST is omitted, uses $_.</span> </font> <img src ="http://www.aygfsteel.com/weidagang2046/aggbug/64224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/weidagang2046/" target="_blank">weidagang2046</a> 2006-08-17 23:28 <a href="http://www.aygfsteel.com/weidagang2046/articles/64224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>列出目录下的所有子目录和文件名http://www.aygfsteel.com/weidagang2046/articles/63516.htmlweidagang2046weidagang2046Mon, 14 Aug 2006 09:36:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/63516.htmlhttp://www.aygfsteel.com/weidagang2046/comments/63516.htmlhttp://www.aygfsteel.com/weidagang2046/articles/63516.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/63516.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/63516.html # !/usr/bin/perl -w

@files   =   < d :/*> ;

print   join ( " \n------\n " ,   @files );


weidagang2046 2006-08-14 17:36 发表评论
]]>
perl自带的介l图形界面的例子http://www.aygfsteel.com/weidagang2046/articles/62958.htmlweidagang2046weidagang2046Fri, 11 Aug 2006 04:21:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/62958.htmlhttp://www.aygfsteel.com/weidagang2046/comments/62958.htmlhttp://www.aygfsteel.com/weidagang2046/articles/62958.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/62958.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/62958.htmlq行widget命o



weidagang2046 2006-08-11 12:21 发表评论
]]>
windows 下的system命o的后台运行求?/title><link>http://www.aygfsteel.com/weidagang2046/articles/62878.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Thu, 10 Aug 2006 15:04:00 GMT</pubDate><guid>http://www.aygfsteel.com/weidagang2046/articles/62878.html</guid><wfw:comment>http://www.aygfsteel.com/weidagang2046/comments/62878.html</wfw:comment><comments>http://www.aygfsteel.com/weidagang2046/articles/62878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/weidagang2046/comments/commentRss/62878.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/weidagang2046/services/trackbacks/62878.html</trackback:ping><description><![CDATA[ <div id="wmqeeuq" class="article" id="art31029"> <div id="wmqeeuq" class="article" id="art31029">发信? cm3 (cm3), 信区: Perl<br />? ? windows 下的system命o的后台运行求?br />发信? 水木C֌ (Thu Aug 10 14:45:04 2006), 站内<br /><br />在linux下,可以用system("abc.exe -s=com1 &");来让abc.exe后台q行?br />但在windows下,安装了activeperlQ怎么来实现类g上面的后台运行?谢了Q!Q?br /><br />--<br /><br />?来源:·水木C֌ newsmth.net·[FROM: 219.237.6.*]<br /></div> <br /> <div id="wmqeeuq" class="tconPager smaller left">[<a ><font color="#002c99">本篇全文</font></a>] [<a ><font color="#002c99">回复文章</font></a>] [本篇作者:<a ><font color="#002c99">qcpassed</font></a>] [<a ><font color="#002c99">回信l作?/font></a>] [<a ><font color="#002c99">q入讨论?/font></a>] [<a ><font color="#002c99">q回剙</font></a>] <div id="wmqeeuq" class="tnum">2</div></div> <div id="wmqeeuq" class="article" id="art31031">发信? qcpassed (xiaoqiao), 信区: Perl<br />? ? Re: windows 下的system命o的后台运行求?br />发信? 水木C֌ (Thu Aug 10 14:57:43 2006), 站内<br /><br />看看system("start abc.exe -s=com1 ");行么<br />??cm3 (cm3) 的大作中提到: ?br /><span id="wmqeeuq" class="f006">: 在linux下,可以用system("abc.exe -s=com1 &");来让abc.exe后台q行?/span><br /><span id="wmqeeuq" class="f006">: 但在windows下,安装了activeperlQ怎么来实现类g上面的后台运行?谢了Q!Q?/span><br /><br /><br /><br />--<br /><br />?来源:·水木C֌ <a target="_blank"><font color="#002c99">http://newsmth.net</font></a>·[FROM: 159.226.43.*]<br /></div> <br /> <div id="wmqeeuq" class="tconPager smaller left">[<a ><font color="#002c99">本篇全文</font></a>] [<a ><font color="#002c99">回复文章</font></a>] [本篇作者:<a ><font color="#002c99">cm3</font></a>] [<a ><font color="#002c99">回信l作?/font></a>] [<a ><font color="#002c99">q入讨论?/font></a>] [<a ><font color="#002c99">q回剙</font></a>] <div id="wmqeeuq" class="tnum">3</div></div> <div id="wmqeeuq" class="article" id="art31037">发信? cm3 (cm3), 信区: Perl<br />? ? Re: windows 下的system命o的后台运行求?br />发信? 水木C֌ (Thu Aug 10 16:32:52 2006), 站内<br /><br />可以Q非帔R常感谢!Q!<br />??qcpassed (xiaoqiao) 的大作中提到: ?br /><span id="wmqeeuq" class="f006">: 看看system("start abc.exe -s=com1 ");行么</span><br /></div> </div> <img src ="http://www.aygfsteel.com/weidagang2046/aggbug/62878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/weidagang2046/" target="_blank">weidagang2046</a> 2006-08-10 23:04 <a href="http://www.aygfsteel.com/weidagang2046/articles/62878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Perl处理Unix命o输出http://www.aygfsteel.com/weidagang2046/articles/62235.htmlweidagang2046weidagang2046Mon, 07 Aug 2006 13:34:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/62235.htmlhttp://www.aygfsteel.com/weidagang2046/comments/62235.htmlhttp://www.aygfsteel.com/weidagang2046/articles/62235.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/62235.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/62235.html # !/usr/bin/perl -w

open ( FILE ,   " ls -l | "  );

while  (  $line   =   < FILE >  )
{
    
chop ( $line );
    
print   $line ,   " \n " ;
}

close (FILE);


weidagang2046 2006-08-07 21:34 发表评论
]]>
Perl文g及目录操?/title><link>http://www.aygfsteel.com/weidagang2046/articles/61995.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Sat, 05 Aug 2006 14:09:00 GMT</pubDate><guid>http://www.aygfsteel.com/weidagang2046/articles/61995.html</guid><wfw:comment>http://www.aygfsteel.com/weidagang2046/comments/61995.html</wfw:comment><comments>http://www.aygfsteel.com/weidagang2046/articles/61995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/weidagang2046/comments/commentRss/61995.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/weidagang2046/services/trackbacks/61995.html</trackback:ping><description><![CDATA[ <font face="Verdana" color="#000000" size="2">大多数程序都不是孤立?它们与它们的环境怺作用。很多的E序也需要通过文g操作实现数据的存贮和交换。 文件句?file handle)是PerlE序中ؓE序和外部世界提供I/Oq接的名U。徏议全部用大写字母以CZ变量{的区别。特别地Q也可以STDIN/STDOUT/STDERR也认为 是Perl的文件句柄,分别代表标准输入/标准输出/标准错误输出。?<br /><br />打开及关闭文件?<br /><br />  Perl的文件操作与C语言极ؓ怼。如Q?<br /><br />open(FILENAME,"abc.txt");  <br /><br />  该调用ؓL件打开Q若为写文g而打开Q需在文件名前加上大于号Q?<br /><br />open(FILENAME,">abc.txt");  <br /><br />  若要q加x件尾Q可在文件名前加上两个大于号Q?<br /><br />open(FILENAME,">>abc.txt");  <br /><br />  以上三种open()格式在成功时q回真,p|时返回假。但E序中通常没有提示Q出错时往往会被Z忽略。 通常当需要给出出错提C时Q可加入die()函数。例Q?<br /><br />open(OUTFILE,">/tmp/outfile")||  <br />die "出错Q不能徏?tmp/outfile\n";  <br /><br />  当只有openp|Ӟ才会执行diel出出错提示。?<br /><br />  Ҏ件句柄的操作完成后,可以用close操作W关闭文件。如Q?<br /><br />close(OUTFILE);  <br /><br />-x 文g试  <br /><br />  Perl的文件操作也可以先测试文件是否存在,是否可读写等。如Q?<br /><br />$x="abc.txt";  <br />if(-e $x) { #abc.txt是否存在Q?<br /># 存在操作  <br />} else {  <br />printf "文g不存在。\n";  <br />}  <br /><br />-e操作W测试文件或目录是否存在。?<br /><br />  以下为文件测试清单:  <br /><br /><br /><br />文g试 试操作W提供的信息  <br />-r 文g或目录可读?<br />-w 文g或目录可写?<br />-x 文g或目录执行?<br />-o 文g或目录归用户所有?<br />-R 文g或目录对真正用户可读  <br />-W 文g或目录对真正用户可写  <br />-X 文g或目录对真正用户执行  <br />-O 文g或目录归真正用户所有?<br />-e 文g或目录存在?<br />-z 文g存在且大ؓ0  <br />-s 文g或目录存在且不ؓ0(q回字节?  <br />-f 文g为普通文件?<br />-d 文g为目录?<br />-l 文g为符号链接?<br />-p 文g为命名管?FIFO)  <br />-S 文gZ个套?socket)  <br />-b 文g为块Ҏ文g  <br />-c 文g为字W特D文件?<br />-t 打开tty控制台的文g句柄  <br />-u 文g或目录是讄用户ID号?<br />-g 文g或目录是讄用户lID号?<br />-k 文g或目录的sticky位置位?<br />-T 文g是文本文件?<br />-B 文g是二q制文g  <br />-M 以天为单位的存在旉  <br />-A 以天为单位访问时闾b?<br />-C 以天为单位同代码更改旉  <br /><br /><br />删除文g  <br /><br />  Perl的unlink()操作W可实现删除文g。如Q?<br /><br />unlink("abc.txt"); #删除abc.txt  <br /><br />文g重命名?<br /><br />  Perl的rename()操作W可实现文g重命名。如Q?<br /><br />rename("abc","zmd")||die "出错,不能更名";  <br /><br />  此时abc更名为zmdQ成功返回真Q否则给出出错提C。?<br /><br />目录操作  <br /><br />  Perl中处理目录非常类g处理文g。?<br /><br />  打开目录句柄Q?<br /><br />opendir(ETC,"/etc")||die "出错,不能打开目录";  <br /><br />  关闭目录句柄Q?<br /><br />closedir(ETC);  <br /><br />  创徏目录Q?<br /><br />mkdir("zmd",0777)||die "不能创徏zmd目录";  <br /><br />  0777为内部权限格式。?<br /><br />  删除目录Q?<br /><br />rmdir("zmd")||die "不能删除zmd目录"?/font> <img src ="http://www.aygfsteel.com/weidagang2046/aggbug/61995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/weidagang2046/" target="_blank">weidagang2046</a> 2006-08-05 22:09 <a href="http://www.aygfsteel.com/weidagang2046/articles/61995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LҎ字符http://www.aygfsteel.com/weidagang2046/articles/47572.htmlweidagang2046weidagang2046Tue, 23 May 2006 01:09:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/47572.htmlhttp://www.aygfsteel.com/weidagang2046/comments/47572.htmlhttp://www.aygfsteel.com/weidagang2046/articles/47572.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/47572.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/47572.html perl  - pi " *.orig "   - " s/[\cM\c@]//g "  file


weidagang2046 2006-05-23 09:09 发表评论
]]>
30 个子q程来ƈ行下载不同的链接http://www.aygfsteel.com/weidagang2046/articles/47327.htmlweidagang2046weidagang2046Sun, 21 May 2006 12:37:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/47327.htmlhttp://www.aygfsteel.com/weidagang2046/comments/47327.htmlhttp://www.aygfsteel.com/weidagang2046/articles/47327.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/47327.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/47327.html    use  LWP :: Simple;
  
use  Parallel :: ForkManager;

  


  
@links =
    [
" http://www.foo.bar/rulez.data " , " rulez_data.txt " ] ,  
    [
" http://new.host/more_data.doc " , " more_data.doc " ] ,
    

  );

  


  
#  同时使用 30 个进E?/span>
   my   $pm   =  new Parallel :: ForkManager( 30 ); 

  
foreach   my   $linkarray  ( @links ) {
    
$pm -> start and  next #  开始 fork

    
my  ( $link , $fn =  @ $linkarray ;
    
warn   " Cannot get $fn from $link "  
      
if  getstore( $link , $fn !=  RC_OK;

    
$pm -> finish;  #  do the exit in the child process
  }
  
$pm -> wait_all_children;

首先通过 new 来初始化一?ForkManager 对象Q同时必L明最大进E数。如果?0 的话可以避?fork 来达到调试程序的作用?/p>

然后使用 $pm->start 来开?fork?$pm 在子q程时返?0 ,父进E时q回子进E的q程P具体请参?Perl ?fork 文档Q。“and next?用来跌父进E。注意:如果 fork p|的话Q?$pm->start 提C错误,E序l束?/p>

$pm->finish l束子程序(假设我们一开始用了 start ?forkQ?/p>

注意Q在子进E中不能使用 $pm->start?如果你想在子q程中用另外一l子q程Q你必须再初始化一?Parallel::ForkManager 对象?br />
from: http://www.perlchina.org/archive/archive.php?action=archive&page=44



weidagang2046 2006-05-21 20:37 发表评论
]]>
ping子网内各L的ƈ发实?/title><link>http://www.aygfsteel.com/weidagang2046/articles/47326.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Sun, 21 May 2006 12:29:00 GMT</pubDate><guid>http://www.aygfsteel.com/weidagang2046/articles/47326.html</guid><wfw:comment>http://www.aygfsteel.com/weidagang2046/comments/47326.html</wfw:comment><comments>http://www.aygfsteel.com/weidagang2046/articles/47326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/weidagang2046/comments/commentRss/47326.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/weidagang2046/services/trackbacks/47326.html</trackback:ping><description><![CDATA[ <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <span style="COLOR: #000000">    </span> <span style="COLOR: #0000ff">sub</span> <span style="COLOR: #000000"> ping_a_host {<br />      </span> <span style="COLOR: #0000ff">my</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800080">$host</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">shift</span> <span style="COLOR: #000000">;<br />      `ping </span> <span style="COLOR: #000000">-</span> <span style="COLOR: #000000">i </span> <span style="COLOR: #800000">1</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">-</span> <span style="COLOR: #000000">c </span> <span style="COLOR: #800000">1</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800080">$host</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800000">2</span> <span style="COLOR: #000000">>/</span> <span style="COLOR: #000000">dev</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">null` </span> <span style="COLOR: #000000">=~</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">/</span> <span style="COLOR: #800000">0</span> <span style="COLOR: #000000"> packets rec</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">?</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800000">0</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">:</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800000">1</span> <span style="COLOR: #000000">;<br />    }<br /><br />    </span> <span style="COLOR: #0000ff">my</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800080">%pid_to_host</span> <span style="COLOR: #000000">;<br />    </span> <span style="COLOR: #0000ff">my</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800080">%host_result</span> <span style="COLOR: #000000">;<br /><br />    </span> <span style="COLOR: #0000ff">sub</span> <span style="COLOR: #000000"> wait_for_a_kid {<br />      </span> <span style="COLOR: #0000ff">my</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800080">$pid</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">wait</span> <span style="COLOR: #000000">;<br />      </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800000">0</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800080">$pid</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000"><</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800000">0</span> <span style="COLOR: #000000">;<br />      </span> <span style="COLOR: #0000ff">my</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800080">$host</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">delete</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800080">$pid_to_host</span> <span style="COLOR: #000000">{</span> <span style="COLOR: #800080">$pid</span> <span style="COLOR: #000000">}<br />        or </span> <span style="COLOR: #0000ff">warn</span> <span style="COLOR: #000000">(</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">Why did I see $pid ($?)\n</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="COLOR: #000000">)</span> <span style="COLOR: #000000">,</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">next</span> <span style="COLOR: #000000">;<br />      </span> <span style="COLOR: #0000ff">warn</span> <span style="COLOR: #000000"> </span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">reaping $pid for $host\n</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="COLOR: #000000">;<br />      </span> <span style="COLOR: #800080">$host_result</span> <span style="COLOR: #000000">{</span> <span style="COLOR: #800080">$host</span> <span style="COLOR: #000000">} </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> $</span> <span style="COLOR: #000000">?</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">?</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800000">0</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">:</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800000">1</span> <span style="COLOR: #000000">;<br />      </span> <span style="COLOR: #800000">1</span> <span style="COLOR: #000000">;<br />    }<br /><br />    </span> <span style="COLOR: #0000ff">my</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800080">@hosts</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">map</span> <span style="COLOR: #000000"> </span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">10.0.1.$_</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="COLOR: #000000">,</span> <span style="COLOR: #000000"> </span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">001</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="COLOR: #000000">..</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">254</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="COLOR: #000000">;<br /><br />    </span> <span style="COLOR: #0000ff">for</span> <span style="COLOR: #000000"> (</span> <span style="COLOR: #800080">@hosts</span> <span style="COLOR: #000000">) {<br />      wait_for_a_kid() </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">keys</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800080">%pid_to_host</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800000">10</span> <span style="COLOR: #000000">;<br />      </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000"> (</span> <span style="COLOR: #0000ff">my</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800080">$pid</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">fork</span> <span style="COLOR: #000000">) {<br />        </span> <span style="COLOR: #008000">#</span> <span style="COLOR: #008000"># parent does<img src="http://www.aygfsteel.com/images/dot.gif" /></span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #000000">        </span> <span style="COLOR: #800080">$pid_to_host</span> <span style="COLOR: #000000">{</span> <span style="COLOR: #800080">$pid</span> <span style="COLOR: #000000">} </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800080">$_</span> <span style="COLOR: #000000">;<br />        </span> <span style="COLOR: #0000ff">warn</span> <span style="COLOR: #000000"> </span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">$pid is processing $_\n</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="COLOR: #000000">;<br />      } </span> <span style="COLOR: #0000ff">else</span> <span style="COLOR: #000000"> { </span> <span style="COLOR: #008000">#</span> <span style="COLOR: #008000"> child does<br />        ## child does<img src="http://www.aygfsteel.com/images/dot.gif" /></span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #000000">        </span> <span style="COLOR: #0000ff">exit</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">!</span> <span style="COLOR: #000000">ping_a_host(</span> <span style="COLOR: #800080">$_</span> <span style="COLOR: #000000">);<br />      }<br />    }<br /><br />    </span> <span style="COLOR: #008000">#</span> <span style="COLOR: #008000"># final reap:</span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #000000">    </span> <span style="COLOR: #800000">1</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">while</span> <span style="COLOR: #000000"> wait_for_a_kid();<br /><br />    </span> <span style="COLOR: #0000ff">for</span> <span style="COLOR: #000000"> (</span> <span style="COLOR: #0000ff">sort</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">keys</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800080">%host_result</span> <span style="COLOR: #000000">) {<br />      </span> <span style="COLOR: #0000ff">print</span> <span style="COLOR: #000000"> </span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">$_ is </span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="COLOR: #000000">,</span> <span style="COLOR: #000000"> (</span> <span style="COLOR: #800080">$host_result</span> <span style="COLOR: #000000">{</span> <span style="COLOR: #800080">$_</span> <span style="COLOR: #000000">} </span> <span style="COLOR: #000000">?</span> <span style="COLOR: #000000"> </span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">good</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">:</span> <span style="COLOR: #000000"> </span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">bad</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="COLOR: #000000">)</span> <span style="COLOR: #000000">,</span> <span style="COLOR: #000000"> </span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">\n</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="COLOR: #000000">;<br />    }<br /></span> </div> <br />from: <a >http://www.perlchina.org/archive/archive.php?action=archive&page=44</a><img src ="http://www.aygfsteel.com/weidagang2046/aggbug/47326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/weidagang2046/" target="_blank">weidagang2046</a> 2006-05-21 20:29 <a href="http://www.aygfsteel.com/weidagang2046/articles/47326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Perl 模块多^C安装Ҏhttp://www.aygfsteel.com/weidagang2046/articles/46454.htmlweidagang2046weidagang2046Tue, 16 May 2006 10:01:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/46454.htmlhttp://www.aygfsteel.com/weidagang2046/comments/46454.htmlhttp://www.aygfsteel.com/weidagang2046/articles/46454.html#Feedback1http://www.aygfsteel.com/weidagang2046/comments/commentRss/46454.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/46454.html

几个主要?CPAN 站点有:

  • 国外Q?

安装Ҏ

我在q里介绍一下各U^C perl 模块的安装方法。以安装DBI模块Z?/p>

Linux/Unix下的安装ҎQ?/strong>

Linux/Unix 下安?Perl 模块有两U方法:手工安装和自动安装。第一U方法是?CPAN 上下载您需要的模块Q手工编译、安装。第二种Ҏ是?CPAN 模块自动完成下蝲、编译、安装的全过E?/p>

  • 手工安装的步骤:
  • ?CPAN 下蝲?DBI 模块 1.13 版的压羃文g DBI-1.13.tar.gzQ假设放?/usr/local/src/ 下?
  • cd /usr/local/src
  • 解压~这个文?q时会新Z个DBI-1.13的目录?br />
    tar xvzf DBI-1.13.tar.gz
  • 换到解压后的目录Q?cd DBI-1.13
  • 生成 makefileQ?code>perl Makefile.PL
  • 生成模块Q?code>make
  • 试模块Q这步可有可无)Q?make test
    如果试l果报告“all test ok”,您就可以攑ֿ地安装编译好的模块了?
  • 安装模块前,先要保您对 perl5 安装目录有可写权限(通常?su 命o获得Q,执行Q?br />
    make install
  • 现在Q试?DBI 模块吧。如果下面的命o没有l出M输出Q那没问题?br />$>perl -MDBI -e1

    上述步骤适合?Linux/Unix 下绝大多数的 Perl 模块。可能还有少数模块的安装Ҏ略有差别Q所以最好先看看安装目录里的 README ?INSTALL?
  • 使用 CPAN 模块自动安装Q?br />安装前需要先联上|,q且您需要取得root权限?
  • perl -MCPAN -e shell

    初次q行CPAN旉要做一些设|,如果您的机器是直接与因特|相联(拨号上网、专U,etc.Q,那么一路回车就行了Q只需要在最后一步选一个离您最q的 CPAN 镜像站点。例如我选的是位于国内的ftp://mirrors.hknet.com/CPAN 。否则,如果您的机器位于防火墙之后,q需要设|ftp代理或http代理。下面是常用 ppm 命o?
  • 获得帮助
    cpan>help
  • 列出CPAN上所有模块的列表
    cpan>m
  • 安装模块Q自动完成DBI模块从下载到安装的全q程?br />cpan>install DBI
  • 退?br />cpan>quit

Win32下的安装ҎQ?/strong>

?Win32 下,使用 Active State ?Perl for Win32Q即Active Perl。Active Perl 的主在Q?br />http://www.activestate.com/ ?br />?Win32 下,比较Ҏ的是使用专门?Active Perl? 定制?Perl 模块。类g CPAN 模块Q?span class="newWikiWord">Active State也开发了一个自动安装工具叫?/span>PPMQPerl Package ManagerQ?/p>

  • 最通常的安装方法是Q?
  • 首先联上|,?dos 命o行下启动 ppm
    ppm
  • 获得帮助
    PPM>h
  • 列出已安装的 DBI 模块信息
    cpan>query DBI
  • 搜烦 cpan 所有匹?DBI 的模?br />cpan>search DBI
  • 安装模块Q自动完?DBI 模块从下载到安装的全q程?br />PPM>install DBI
  • 退?br />PPM>q
  • 如果您的机器位于防火墙之后,通过 http 代理上网Q那么可以用下面的Ҏ?
  • 讑֮环境变量 HTTP_proxy
    C: \ > set HTTP_proxy=http://proxy:8080
    如果你的代理需要用户名和密码,你还要设定环境变? HTTP_proxy_user ?HTTP_proxy_pass
  • 安装 activeperl 不包括的模块
    如果 ppm 没有某个 CPAN 的模块,只要q个模块不需要编译(没有使用 C {)那你可以把这个模块从 CPAN 下蝲Q解压然后放C?activeperl 的库路径里, perl -e "print join ' ' @INC" 昄?perl 的库路径?
  • activeperl 里不包括所有的 CPAN 模块Q其他地方可能提供这些模块的下蝲Q?
  • 比如?activeperl 5.8 ?GD 模块安装请用如下命令:
    >ppm install http://theoryx5.uwinnipeg.ca/ppms/GD.ppd
  • activeperl 5.6 ?GD 模块安装请用如下命令:
    >ppm install http://theoryx5.uwinnipeg.ca/ppmpackages/GD.ppd
  • 其他 activeperl 模块下蝲地址请参?Perl学习指南 ?

以上较ؓ详细地描qC各种q_?Perl 模块的安装方法。希望能够帮助国?Perl 爱好者们通过使用现有大量优秀?Perl 模块Q避免重复劳动,提高效率Q更好发?Perl 语言的强大威力?br />
from: http://www.perlchina.org/archive/archive.php?action=archive&page=51



weidagang2046 2006-05-16 18:01 发表评论
]]>
How can I use Perl interactively?http://www.aygfsteel.com/weidagang2046/articles/45122.htmlweidagang2046weidagang2046Mon, 08 May 2006 16:35:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/45122.htmlhttp://www.aygfsteel.com/weidagang2046/comments/45122.htmlhttp://www.aygfsteel.com/weidagang2046/articles/45122.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/45122.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/45122.htmlperl -de 0 (The more positive hackers prefer perl -de 1. :-)

Now you can type in any legal Perl code, and it will be immediately evaluated. You can also examine the symbol table, get stack backtraces, check variable values, and if you want to, set breakpoints and do the other things you can do in a symbolic debugger.

from: http://www.perl.com/doc/FAQs/FAQ/oldfaq-html/Q3.1.html



weidagang2046 2006-05-09 00:35 发表评论
]]>
ref函数判断变量是何U类型的引用http://www.aygfsteel.com/weidagang2046/articles/45119.htmlweidagang2046weidagang2046Mon, 08 May 2006 16:16:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/45119.htmlhttp://www.aygfsteel.com/weidagang2046/comments/45119.htmlhttp://www.aygfsteel.com/weidagang2046/articles/45119.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/45119.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/45119.html    ref EXPR
    ref     Returns a non-empty string if EXPR is a reference, the empty
            string otherwise. If EXPR is not specified, $_ will be used. The
            value returned depends on the type of thing the reference is a
            reference to. Builtin types include:

                SCALAR
                ARRAY
                HASH
                CODE
                REF
                GLOB
                LVALUE

            If the referenced object has been blessed into a package, then
            that package name is returned instead. You can think of "ref" as
            a "typeof" operator.

                if (ref($r) eq "HASH") {
                    print "r is a reference to a hash.\n";
                }
                unless (ref($r)) {
                    print "r is not a reference at all.\n";
                }
                if (UNIVERSAL::isa($r, "HASH")) {  # for subclassing
                    print "r is a reference to something that isa hash.\n";
                }

            See also perlref.

 



weidagang2046 2006-05-09 00:16 发表评论
]]>
删除某目录下最后修Ҏ期大于X天的文ghttp://www.aygfsteel.com/weidagang2046/articles/44257.htmlweidagang2046weidagang2046Sun, 30 Apr 2006 16:47:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/44257.htmlhttp://www.aygfsteel.com/weidagang2046/comments/44257.htmlhttp://www.aygfsteel.com/weidagang2046/articles/44257.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/44257.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/44257.html use  strict;
use  warnings;

@ARGV   >   0   ||   die   " Usage: perl file_checker.pl [dir]\n " ;

opendir (DIR ,   $ARGV [ 0 ])  ||   die   " Can't open directory: $!\n " ;

my   @file_list   =   readdir (DIR);

foreach   my   $file  ( @file_list )
{
    
$file   =   " $ARGV[0]/$file " ;
    
if ( - $file )
    {
        
if ( - $file   >   100 )
        {
            
print   $file ,   " \n " ;
            
unlink   $file ;
        }
    }
}

closedir (DIR);

weidagang2046 2006-05-01 00:47 发表评论
]]>
k1205 extractorhttp://www.aygfsteel.com/weidagang2046/articles/44223.htmlweidagang2046weidagang2046Sun, 30 Apr 2006 08:19:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/44223.htmlhttp://www.aygfsteel.com/weidagang2046/comments/44223.htmlhttp://www.aygfsteel.com/weidagang2046/articles/44223.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/44223.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/44223.html $arg_num   =   @ARGV ;

(
$arg_num   ==   1 ||   die ( " usage: perl $0 [file]\n " );

open (FH ,   $ARGV [ 0 ])  ||   die ( " Failed to open $ARGV[0]\n " );

$flag   =   0 ;
$begin_symbol   =   ' |HEX |0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |A |B |C |D |E |F | ' ;

while ( $line   =   < FH > )
{
    
chop ( $line );
    
if ( 1   !=   $flag   ||   $line   =~   /^\| 0 \ s{ 3 } \|/ )
    {
        
$flag   =   1 ;
        
@bytes   =   split ( /\|/,   $line );
        
for ( $i   =   2 $i   <   @bytes $i ++ )
        {
            
push ( @data ,   $bytes [ $i ]);
        }
    }
}

# print join(" ", @data), "\n";

$beginOffset   =   3 ;
$group   =   3 ;

$group   =   3   -   $group ;

$pattern1   =   0x1   <<  ( 2   *   $group );
$pattern2   =   0x2   <<  ( 2   *   $group );

$count   =   0 ;

for ( $i   =   $beginOffset $i   <   @data $i   +=   4 )
{
    
$num   =   0 ;
    
for ( $j   =   0 $j   <   4 $j ++ )
    {
        
$part [ $j =  (( hex ( $data [ $i + $j ])  &  ( 0x1   <<  ( 2   *   $group )))  >>  ( 2   *   $group <<   1 |
                    ((
hex ( $data [ $i + $j ])  &  ( 0x2   <<  ( 2   *   $group )))  >>  ( 2   *   $group >>   1 );
        
$num   =  ( $num   <<   2 |   $part [ $j ];
    }

    
if ( $num   <   16 )
    {
        
print   " 0 " ;
    }
    
printf   " %x  " ,   $num ;
    
if ( ++ $count   %   16   ==   0 )
    {
        
print   " \n " ;
    }
}

close (FH);

weidagang2046 2006-04-30 16:19 发表评论
]]>
某目录下(包括子目录)的所?c文g重命名ؓ.cpp文ghttp://www.aygfsteel.com/weidagang2046/articles/38215.htmlweidagang2046weidagang2046Thu, 30 Mar 2006 03:29:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/38215.htmlhttp://www.aygfsteel.com/weidagang2046/comments/38215.htmlhttp://www.aygfsteel.com/weidagang2046/articles/38215.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/38215.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/38215.html # !/usr/bin/perl -w

use  File :: Find;

@ARGV   >   0   ||   die   " usage:\nperl $ [directory] " ;

$dir   =   $ARGV [ 0 ];

find(
\& traverse ,   $dir );

sub  traverse
{
    
print   $_ ,   " \n " ;
    
if ( - $_   &&   $_   =~   / ( .* ) . c$ / )
    {
        
print   " rename $_ to $1.cpp " ,   " \n " ;
        
rename   $_ ,   " $1.cpp " ;
    }
}


weidagang2046 2006-03-30 11:29 发表评论
]]>
evalhttp://www.aygfsteel.com/weidagang2046/articles/37926.htmlweidagang2046weidagang2046Tue, 28 Mar 2006 15:03:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/37926.htmlhttp://www.aygfsteel.com/weidagang2046/comments/37926.htmlhttp://www.aygfsteel.com/weidagang2046/articles/37926.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/37926.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/37926.html # !/usr/bin/perl -w

push ( @program ,   ' $i = 1; ' );
push ( @program ,   ' print "The number is ", $i; ' );

foreach   $exp  ( @program )
{
    
eval ( $exp );
}


weidagang2046 2006-03-28 23:03 发表评论
]]>
匚w某目录下所有文?/title><link>http://www.aygfsteel.com/weidagang2046/articles/37487.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Sun, 26 Mar 2006 09:30:00 GMT</pubDate><guid>http://www.aygfsteel.com/weidagang2046/articles/37487.html</guid><wfw:comment>http://www.aygfsteel.com/weidagang2046/comments/37487.html</wfw:comment><comments>http://www.aygfsteel.com/weidagang2046/articles/37487.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/weidagang2046/comments/commentRss/37487.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/weidagang2046/services/trackbacks/37487.html</trackback:ping><description><![CDATA[ <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <span style="COLOR: #008000">#</span> <span style="COLOR: #008000">!/usr/bin/perl -w</span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #800080">$file_pattern</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="FONT-WEIGHT: bold; COLOR: #000000">'</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">f:/tmp/*.pl</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">'</span> <span style="COLOR: #000000">;<br /><br /></span> <span style="COLOR: #800080">@file_list</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">glob</span> <span style="COLOR: #000000">(</span> <span style="COLOR: #800080">$file_pattern</span> <span style="COLOR: #000000">);<br /><br /></span> <span style="COLOR: #0000ff">foreach</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800080">$file</span> <span style="COLOR: #000000"> (</span> <span style="COLOR: #800080">@file_list</span> <span style="COLOR: #000000">)<br />{<br />    </span> <span style="COLOR: #0000ff">print</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #800080">$file</span> <span style="COLOR: #000000">,</span> <span style="COLOR: #000000"> </span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">\n</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">"</span> <span style="COLOR: #000000">;<br />}</span> </div> <img src ="http://www.aygfsteel.com/weidagang2046/aggbug/37487.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/weidagang2046/" target="_blank">weidagang2046</a> 2006-03-26 17:30 <a href="http://www.aygfsteel.com/weidagang2046/articles/37487.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Expect 教程中文?/title><link>http://www.aygfsteel.com/weidagang2046/articles/37412.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Sat, 25 Mar 2006 15:24:00 GMT</pubDate><guid>http://www.aygfsteel.com/weidagang2046/articles/37412.html</guid><wfw:comment>http://www.aygfsteel.com/weidagang2046/comments/37412.html</wfw:comment><comments>http://www.aygfsteel.com/weidagang2046/articles/37412.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/weidagang2046/comments/commentRss/37412.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/weidagang2046/services/trackbacks/37412.html</trackback:ping><description><![CDATA[[版权声明]<br />  <br />  Copyright(c) 1999<br />    <br />  本教E由*葫芦?译Qƈ做了适当的修改,可以自由的用于非商业目的?br />  但Redistribution时必L贝本[版权声明]。      <br /><br />[BUG]<br /><br />  有不部分,译的时候不能作到“信Q达”。当然了QQ何时候都没有做到“雅”,希望各位谅解?br /><br />[原著]<br />  <br />  Don Libes: National Institute of Standards and Technology <br />    libes@cme.nist.gov<br /><br />[目录]<br />  <br />  1.摘要<br />  2.关键?br />  3.?br />  4.ExpectlD<br />  5.callback<br />  6.passwd 和一致性检?br />  7.rogue 和伪l端<br />  8.ftp<br />  9.fsck<br />  10.多进E控Ӟ作业控制<br />  11.交互式用Expect<br />  12.交互式Expect~程<br />  13.非交互式E序的控?br />  14.Expect的速度<br />  15.安全斚w的考虑<br />  16.Expect资源<br />  17.参考书c?br /><br />1.[摘要]<br /><br />  C的Shell对程序提供了最限度的控制(开始,停止Q等{?Q而把交互的特性留l了用户?q意味着有些E序Q你不能非交互的q行Q比如说passwd?有一些程序可以非交互的运行,但在很大E度上׃灉|性,比如说fsck。这表明Unix的工h造逻辑开始出现问题。Expect恰恰填补了其中的一些裂痕,解决了在Unix环境中长期存在着的一些问题?br /><br />  Expect使用Tcl作ؓ语言核心。不仅如此,不管E序是交互和q是非交互的QExpect都能q用。这是一个小语言和Unix的其他工具配合v来生强大功能的l典例子?br />  <br />  本部分教Eƈ不是有关Expect的实玎ͼ而是关于Expect语言本n的用,q主要也是通过不同的脚本描qC子来体现。其中的几个例子q例证了Expect的几个新特征?br /> <br />2.[关键字]<br />  <br />  Expect,交互QPOSIX,E序化的对话QShell,Tcl,Unix;<br /><br />3.[介]<br />  <br />  一个叫做fsck的Unix文gpȝ查程序,可以从Shell里面?y或?n选项来执行。 在手册[1]里面Q?y选项的定义是象这L?br /><br />  “对于fsck的所有问题都假定一个“yes”响应;在这样用的时候,必须特别的小心,因ؓ它实际上允许E序无条件的l箋q行Q即使是遇到了一些非怸重的错误?br />  <br />  相比之下Q?n选项安全的多,但它实际上几乎一点用都没有。这U接口非常的p糕Q但是却有许多的E序都是q种风格。 文g传输E序ftp有一个选项可以止交互式的提问Q以便能从一个脚本里面运行。但一旦发生了错误Q它没有提供的处理措施?br /><br />  Expect是一个控制交互式E序的工兗他解决了fsck的问题,用非交互的方式实C所有交互式的功能。Expect不是特别为fsck设计的,它也能进行类似ftp的出错处理?br /><br />  fsck和ftp的问题向我们展示了象sh,csh和别的一些shell提供的用h口的局限性。 Shell没有提供从一个程序读和象一个程序写的功能。这意味着shell可以q行fsck但只能以牺牲一部分fsck的灵zL做代h。有一些程序根本就不能被执行。比如说Q如果没有一个用h口交互式的提供输入,没法运行下厅R其他还有象Telnet,crypt,su,rlogin{程序无法在shell脚本里面自动执行。还有很多其他的应用E序在设计是也是要求用户输入的?br /><br />  Expect被设计成专门针和交互式程序的交互。一个ExpectE序员可以写一个脚本来描述E序和用L对话。接着ExpectE序可以非交互的q行“交互式”的E序。写交互式程序的脚本和写非交互式E序的脚本一L单。Expectq可以用于对对话的一部分q行自动化,因ؓE序的控制可以在键盘和脚本之间进行切换?br /><br />bes[2]里面有详l的描述。简单的_脚本是用一U解释性语a写的?也有C和C++的Expect库可供用,但这出了本文的范围).Expect提供了创Z互式q程和读写它们的输入和输出的命o。 Expect是由于它的一个同名的命o而命名的?br /><br />  Expect语言是基于Tcl的。Tcl实际上是一个子E序库,q些子程序库可以嵌入到程序里从而提供语a服务。 最l的语言有点象一个典型的Shell语言。里面有l变量赋值的set命oQ控制程序执行的if,for,continue{命令,q能q行普通的数学和字W串操作。当然了Q还可以用exec来调用UnixE序。所有这些功能,Tcl都有。Tcl在参考书c?Outerhour[3][4]里有详细的描q?br /><br />  Expect是在Tcl基础上创v来的Q它q提供了一些Tcl所没有的命令。spawn命oȀzM个UnixE序来进行交互式的运行。 send命o向进E发送字W串。expect命o{待q程的某些字W串。 expect支持正规表达式ƈ能同时等待多个字W串QƈҎ一个字W串执行不同的操作。expectq能理解一些特D情况,如超时和遇到文g?br /><br />  expect命o和Tcl的case命o的风格很怼。都是用一个字W串d配多个字W串?只要有可能,新的命oL和已有的Tcl命o怼Q以使得该语a保持工具族的l承?。下面关于expect的定义是从手册[5]上摘录下来的?br /><br />      expect patlist1 action1 patlist2 action2.....<br /><br />    该命令一直等到当前进E的输出和以上的某一个模式相匚wQ或者等    到时间超q一个特定的旉长度Q或者等到遇C文g的结束ؓ止?br />    <br />    如果最后一个action是空的,可以省略它?br /><br />    每一个patlist都由一个模式或者模式的?lists)l成。如果有一个模式匹配成功,相应的actionp执行。执行的l果从expectq回?br />    被精匹配的字符?或者当时发生Ӟ已经d但未q行匚w的字W串)被存贮在变量expect_match里面。如果patlist是eof或者timeout,则发生文件结束或者超时时才执行相应的action.一般超时的时值是10U,但可以用cM"set timeout 30"之类的命令把时时D定ؓ30U?br />    <br />    下面的一个程序段是从一个有关登录的脚本里面摘取的。abort是在脚本的别处定义的q程Q而其他的action使用cM与C语言的Tcl原语?br /><br />      expect "*welcome*"        break     <br />           "*busy*"        {print busy;continue} <br />          "*failed*"        abort  <br />          timeout        abort<br /><br />    模式是通常的C Shell风格的正规表辑ּ。模式必d配当前进E的从上一个expect或者interact开始的所有输?所以统配符*使用的非?的普遍。但是,一旦输q?000个字节,前面的字W就会被忘记Q这可以通过讑֮match_max的值来改变?br /><br />  expect命o实体现了expect语言的最好和最坏的性质。特别是Qexpect命o的灵zL是以经常出Co惑的语法做代仗除了关键字模式(比如说eof,timeout)那些模式表可以包括多个模式。这保证提供了一U方法来区分他们。但是分开q些表需要额外的扫描Q如果没有恰当的用["]括v来,q有可能会把和当成空白字W。由于Tcl提供了两U字W串引用的方法:单引和双引,情况变的更糟?在Tcl里面Q如果不会出C义性话Q没有必要用引?。在expect的手册里面,q有一个独立的部分来解释这U复杂性。幸q的是:有一些很好的例子gL了这U抱怨。但是,q个复杂性很有可能在来的版本中再度出现。ؓ了增强可L,在本文中Q提供的脚本都假定双引号是够的?br /><br />  字符可以使用反斜杠来单独的引用,反斜杠也被用于对语句的gl,如果不加反斜杠的话,语句C行的l尾处就l束了。这和Tcl也是一致的。Tcl在发现有开的单引号或者开的双引号旉会l扫描。而且Q分号可以用于在一行中分割多个语句。这乍听h有点让h困惑Q但是,q是解释性语a的风|但是Q这实是Tcl的不太漂亮的部分?br /><br />5.[callback]<br /><br />  令h非常惊讶的是Q一些小的脚本如何的产生一些有用的功能。下面是一个拨电话L的脚本。他用来把收费反向,以便使得镉K电话对计算贏V这个脚本用cM“expect callback.exp 12016442332”来ȀzR其中,脚本的名字便是callback.expQ?1(201)644-2332是要拨的电话L?br /><br />    #first give the user some time to logout<br />    exec sleep 4<br />    spawn tip modem<br />    expect "*connected*"<br />    send "ATD [index $argv 1] "<br />    #modem takes a while to connect<br />    set timeout 60<br />    expect "*CONNECT*"<br /><br />  W一行是注释Q第二行展示了如何调用没有交互的UnixE序。sleep 4会ɽE序d4U,以得用h旉来退出,因ؓmodemL会回叫用户已l用的电话L?br /><br />  下面一行用spawn命o来激ztipE序Q以便得tip的输够被expect所dQ得tip能从send读输入。一旦tip说它已经q接上,modem׃要求L打大哥电话号码?假定modem都是贺氏兼容的,但是本脚本可以很Ҏ的修Ҏ能适应别的cd的modem)。不论发生了什么,expect都会l止。如果呼叫失败,expect脚本可以设计成进行重试,但这里没有。如果呼叫成功,getty会在expect退出后到DTRQƈ且向用户提示loging:?实用的脚本往往提供更多的错误检??br /><br />  q个脚本展示了命令行参数的用,命o行参数存贮在一个叫做argv的表里面(q和C语言的风格很?。在q种情况下,W一个元素就是电话号码。方括号使得被括h的部分当作命令来执行Q结果就替换被括h的部分。这也和C Shell的风格很象?br /><br />  q个脚本和一个大U?0K的C语言E序实现的功能相伹{?br />    <br /><br />6.[passwd和一致性检查]<br /><br />  在前面,我们提到passwdE序在缺乏用户交互的情况下,不能q行Qpasswd会忽略I/O重定向,也不能嵌入到道里边以便能从别的E序或者文仉d输入。这个程序坚持要求真正的与用戯行交互。因为安全的原因Qpasswd被设计成q样Q但l果D没有非交互式的方法来验passwd。这样一个对pȝ安全臛_重要的程序竟然没有办法进行可靠的验,真实h讽刺意味?br /><br />  passwd以一个用户名作ؓ参数Q交互式的提C入密码。下面的expect脚本以用户名和密码作为参数而非交互式的q行?br /><br />    spawn oasswd [index $argv 1]<br />    set password [index $argv 2]<br />    expect "*password:"<br />    send "$password "<br />    expect "*password:"<br />    send "$password "<br />    expect eof<br /><br />  W一行以用户名做参数启动passwdE序Qؓ方便赯Q第二行把密码存C个变量里面。和shellcMQ变量的使用也不需要提前声明?br /><br />  在第三行Qexpect搜烦模式"*password:"Q其?允许匚wL输入Q所以对于避免指定所有细节而言是非常有效的?上面的程序里没有action,所以expect到该模式后ql运行?br /><br />  一旦接收到提示后,下一行就把密码送给当前q程。表明回车?实际上,所有的C的关于字W的U定都支?。上面的E序中有两个expect-send序列Q因为passwdZ对输入进行确认,要求q行两次输入。在非交互式E序里面Q这是毫无必要的Q但׃假定passwd是在和用戯行交互,所以我们的脚本q是q样做了?br /><br />  最后,"expect eof"q一行的作用是在passwd的输Z搜烦文gl束W,q一行语句还展示了关键字的匹配。另外一个关键字匚w是timeout了,timeout被用于表C所有匹配的p|而和一D늉定长度的旉相匹配。在q里eof是非常有必要的,因ؓpasswd被设计成会检查它的所有I/O是否都成功了Q包括第二次输入密码时生的最后一个新行?br /><br />  q个脚本已经_展示passwd命o的基本交互性。另外一个更加完备的例子回检查别的一些行为。比如说Q下面的q个脚本p查passwdE序的别的几个方面。所有的提示都进行了查。对垃圾输入的检查也q行了适当的处理。进E死亡,乎d的慢响应Q或者别的非预期的行为都q行了处理?br /><br />    spawn passwd [index $argv 1]<br />    expect     eof            {exit 1}     <br />        timeout            {exit 2}    <br />        "*No such user.*"    {exit 3}    <br />        "*New password:"    <br />    send "[index $argv 2 "<br />    expect     eof            {exit 4}    <br />        timeout            {exit 2}    <br />        "*Password too long*"    {exit 5}    <br />        "*Password too short*"    {exit 5}    <br />        "*Retype ew password:"<br />    send "[index $argv 3] "<br />    expect     timeout            {exit 2}    <br />        "*Mismatch*"        {exit 6}    <br />        "*Password unchanged*"    {exit 7}    <br />        " "        <br />    expect    timeout            {exit 2}    <br />        "*"            {exit 6}    <br />        eof<br /><br />   <br />  q个脚本退出时用一个数字来表示所发生的情c?表示passwdE序正常q行Q?表示非预期的MQ?表示锁定Q等{。用数字是Z单v见。expectq回字符串和q回数字是一L单的Q即使是zE序自n产生的消息也是一L。实际上Q典型的做法是把整个交互的过E存C个文仉面,只有当程序的q行和预期一L时候才把这个文件删除。否则这个log被留待以后进一步的查?br /><br />  q个passwd查脚本被设计成由别的脚本来驱动。这W二个脚本从一个文仉面读取参数和预期的结果。对于每一个输入参数集Q它调用W一个脚本ƈ且把l果和预期的l果相比较?因ؓq个d是非交互的,一个普通的老式shell可以用来解释第二个脚本)。比如说Q一个passwd的数据文件很有可能就象下面一栗?br /><br />    passwd.exp    3    bogus    -        -<br />    passwd.exp    0    fred    abledabl    abledabl<br />    passwd.exp    5    fred    abcdefghijklm    -<br />    passwd.exp    5    fred    abc        -<br />    passwd.exp    6    fred    foobar        bar    <br />    passwd.exp    4    fred    ^C        -<br /><br />  W一个域的名字是要被q行的回归脚本。第二个域是需要和l果相匹配的退出倹{第三个域就是用户名。第四个域和W五个域是提示时应该输入的密码。减号仅仅表C那里有一个域Q这个域其实l对不会用到。在W一个行中,bogus表示用户名是非法的,因此passwd会响应说Q没有此用户。expect在退出时会返?Q?恰好是W二个域。在最后一行中Q^C是被切实的送给E序来验证程序是否恰当的退出?br /><br />  通过q种ҎQexpect可以用来验和调试交互式YӞq恰恰是IEEE的POSIX 1003.2(shell和工?的一致性检验所要求的。进一步的说明请参考Libes[6]?br /><br />7.[rogue 和伪l端]<br /><br />  Unix用户肯定寚w过道来和其他q程相联pȝ方式非常的熟?比如_一个shell道)。expect使用伪终端来和派生的q程相联pR伪l端提供了终端语义以便程序认Z们正在和真正的终端进行I/O操作?br /><br />  比如_BSD的探险游戏rogue在生模式下运行,q假定在q接的另一端是一个可d的字W终端。可以用expect~程Q得通过使用用户界面可以玩这个游戏?br /><br />  rogueq个探险游戏首先提供l你一个有各种物理属性,比如说力量|的角艌Ӏ在大部分时间里Q力量值都?6Q但在几乎每20ơ里面就会有一个力量值是18。很多的rogue玩家都知道这一点,但没有h愿意启动E序20ơ以获得一个好的配|。下面的q个脚本p辑ֈq个目的?br /><br />    for {} {1} {} {<br />        spawn rogue<br />        expect "*Str:18*"    break    <br />            "*Str:16*"    <br />        close<br />        wait<br />    }<br />    interact<br /><br />  W一行是个for循环Q和C语言的控制格式很象。rogue启动后,expect检查看力量值是18q是16Q如果是16Q程序就通过执行close和wait来退出。这两个命o的作用分别是关闭和伪l端的连接和{待q程退出。rogued一个文件结束符推出,从而@环l运行,产生一个新的rogue游戏来检查?br /><br />  当一个gؓ18的配|找到后Q控制就推出循环q蟩到最后一行脚本。interact把控制{Uȝ用户以便他们能够玩这个特定的游戏?br /><br />  惌一下这个脚本的q行。你所能真正看到的是20或?0个初始的配置在不CU钟的时间里掠过屏幕Q最后留l你的就是一个有着很好配置的游戏。唯一比这更好的方法就是用调试工h玩游戏?br /><br />  我们很有必要认识到这样一点:rogue是一个用光标的囑Ş游戏。expectE序员必M解到Q光标的q动q不一定以一U直观的方式在屏q上体现。幸q的是,在我们这个例子里Q这不是一个问题。将来的对expect的改q可能会包括一个内嵌的能支持字W图形区域的l端模拟器?br /><br />8.[ftp]<br /><br />  我们使用expect写第一个脚本ƈ没有打印?Hello,World"。实际上Q它实现了一些更有用的功能。它能通过非交互的方式来运行ftp。ftp是用来在支持TCP/IP的网l上q行文g传输的程序。除了一些简单的功能Q一般的实现都要求用L参与?br /><br />  下面q个脚本从一个主Z使用匿名ftp取下一个文件来。其中,L名是W一个参数。文件名是第二个参数?br /><br />        spawn    ftp    [index $argv 1]<br />        expect "*Name*"<br />        send     "anonymous "<br />        expect "*Password:*"<br />        send [exec whoami]<br />        expect "*ok*ftp>*"<br />        send "get [index $argv 2] "<br />        expect "*ftp>*"<br /><br />  上面q个E序被设计成在后台进行ftp。虽然他们在底层使用和expectcM的机Ӟ但他们的可编E能力留待改q。因为expect提供了高U语aQ你可以对它q行修改来满你的特定需求。比如说Q你可以加上以下功能Q?br /><br />    Q坚持-Q如果连接或者传输失败,你就可以每分钟或者每时Q甚<br />        臛_以根据其他因素,比如说用L负蝲Q来q行不定期的<br />        重试?br />    Q通知Q-传输时可以通过mail,write或者其他程序来通知你,甚至<br />        可以通知p|?br />    Q初始化Q每一个用户都可以有自q用高U语a~写的初始化文g<br />        (比如_.ftprc)。这和C shell?cshrc的用很cM?br /><br />  expectq可以执行其他的更复杂的d。比如说Q他可以使用McGill大学的Archiepȝ。Archie是一个匿名的Telnet服务Q它提供ҎqInternet上可通过匿名ftp获取的文件的数据库的讉K。通过使用q个服务Q脚本可以询问Archie某个特定的文件的位置Qƈ把它从ftp服务器上取下来。这个功能的实现只要求在上面那个脚本中加上几行就可以?br /><br />  现在q没有什么已知的后台-ftp能够实现上面的几功能,能不要说所有的功能了。在expect里面Q它的实现却是非常的单。“坚持”的实现只要求在expect脚本里面加上一个@环。“通知”的实现只要执行mail和write可以了。“初始化文g”的实现可以使用一个命令,source .ftprcQ就可以了,?ftprc里面可以有Q何的expect命o?br /><br />  虽然q些特征可以通过在已有的E序里面加上钩子函数可以,但这也不能保证每一个h的要求都能得到满뀂唯一能够提供保证的方法就是提供一U通用的语a。一个很好的解决Ҏ是把Tcl自n融入到ftp和其他的E序中间厅R实际上Q这本来是Tcl的初街在q没有这样做之前Qexpect提供了一个能实现大部分功能但又不需要Q何重写的Ҏ?br /><br />9.[fsck]<br /><br />  fsck是另外一个缺乏够的用户接口的例子。fsck几乎没有提供什么方法来预先的回{一些问题。你能做的就是给所有的问题都回{?yes"或者都回答"no"?br /><br />  下面的程序段展示了一个脚本如何的使的自动的对某些问题回答"yes"Q而对某些问题回答"no"。下面的q个脚本一开始先zfsckq程Q然后对其中两种cd的问题回{?yes"Q而对其他的问题回{?no"?br /><br />    for {} {1} {} {<br />        expect <br />            eof        break        <br />            "*UNREF FILE*CLEAR?"    {send "r "}    <br />            "*BAD INODE*FIX?"    {send "y "}    <br />            "*?"            {send "n "}    <br />    }<br /><br />  在下面这个版本里面,两个问题的回{是不同的。而且Q如果脚本遇C什么它不能理解的东西,׃执行interact命o把控制交l用戗用L击键直接交给fsck处理。当执行完后Q用户可以通过?+"键来退出或者把控制交还lexpect。如果控制是交还l脚本了Q脚本就会自动的控制q程的剩余部分的q行?br /><br />    for {} {1} {}{<br />        expect             <br />            eof        break        <br />            "*UNREF FILE*CLEAR?"    {send "y "}    <br />            "*BAD INODE*FIX?"    {send "y "}    <br />            "*?"            {interact +}    <br />    }<br /><br />  如果没有expectQfsck只有在牺牲一定功能的情况下才可以非交互式的运行。fsck几乎是不可编E的Q但它却是系l管理的最重要的工兗许多别的工L用户接口也一L不。实际上Q正是其中的一些程序的不D了expect的诞生?br /><br />10.[控制多个q程Q作业控制]<br /><br /><br />  expect的作业控制概늲巧的避免了通常的实现困难。其中包括了两个问题Q一个是expect如何处理l典的作业控Ӟ卛_你在l端上按下^Z键时expect如何处理Q另外一个就是expect是如何处理多q程的?br /><br />  对第一个问题的处理是:忽略它。expect对经典的作业控制一无所知。比如说Q你z了一个程序ƈ且发送一个^Zl它Q它׃停下?q是伪终端的完美之处)而expect׃永远的等下去?br /><br />  但是Q实际上Q这Ҏ׃成一个问题。对于一个expect脚本Q没有必要向q程发送^Z。也是_没有必要停下一个进E来。expect仅仅是忽略了一个进E,而把自己的注意力转移到其他的地方。这是expect的作业控制思想Q这个思想也一直工作的很好?br /><br />  从用L角度来看是象q样的:当一个进E通过spawn命o启动Ӟ变量spawn_idp讄成某q程的描q符。由spawn_id描述的进E就被认为是当前q程?q个描述W恰恰就是伪l端文g的描q符Q虽然用h它当作一个不透明的物?。expect和send命o仅仅和当前进E进行交互。所以,切换一个作业所需要做的仅仅是把该q程的描q符赋给spawn_id?br /><br />  q儿有一个例子向我们展示了如何通过作业控制来两个chessq程q行交互。在z完两个进E之后,一个进E被通知先动一步。在下面的@环里面,每一步动作都送给另外一个进E。其中,read_move和write_move两个q程留给读者来实现?实际上,它们的实现非常的ҎQ但是,׃太长了所以没有包含在q里)?br /><br />    spawn chess            ;# start player one<br />    set id1    $spawn_id<br />    expect "Chess "<br />    send "first "            ;# force it to go first<br />    read_move<br /><br />    spawn chess            ;# start player two<br />    set id2    $spawn_id<br />    expect "Chess "<br />    <br />    for {} {1} {}{<br />        send_move<br />        read_move<br />        set spawn_id    $id1<br />        <br />        send_move<br />        read_move<br />        set spawn_id    $id2<br />    }<br /><br />   有一些应用程序和chessE序不太一P在chessE序里,的两个玩家轮动。下面这个脚本实C一个冒充程序。它能够控制一个终端以便用戯够登录和正常的工作。但是,一旦系l提C入密码或者输入用户名的时候,expect开始把击键C来,一直到用户按下回R键。这有效的收集了用户的密码和用户名,q避免了普通的冒充E序?Incorrect password-tryagain"。而且Q如果用戯接到另外一个主ZQ那些额外的d也会被记录下来?br /><br />    spawn tip /dev/tty17        ;# open connection to<br />    set tty $spawn_id        ;# tty to be spoofed<br /><br />    spawn login<br />    set login $spawn_id<br /><br />    log_user 0<br />    <br />    for {} {1} {} {<br />        set ready [select $tty $login]<br />        <br />        case $login in $ready {<br />            set spawn_id $login<br />            expect         <br />              {"*password*" "*login*"}{<br />                  send_user $expect_match<br />                  set log 1<br />                 }    <br />              "*"        ;# ignore everything else<br />            set spawn_id    $tty;<br />            send $expect_match<br />        }<br />        case $tty in $ready {<br />            set spawn_id    $tty<br />            expect "* *"{<br />                    if $log {<br />                      send_user $expect_match<br />                      set log 0<br />                    }<br />                   }    <br />                "*" {<br />                    send_user $expect_match<br />                   }<br />            set spawn_id     $login;<br />            send $expect_match<br />        }<br />    } <br />        <br /><br />   q个脚本是这样工作的。首先连接到一个loginq程和终端。缺省的Q所有的对话都记录到标准输出?通过send_user)。因为我们对此ƈ不感兴趣Q所以,我们通过命o"log_user 0"来禁止这个功能?有很多的命o来控制可以看见或者可以记录的东西)?br /><br />   在@环里面,select{待l端或者loginq程上的动作Qƈ且返回一个等待输入的spawn_id表。如果在表里面找C一个值的话,case执行一个action。比如说Q如果字W串"login"出现在loginq程的输ZQ提C就会被记录到标准输ZQƈ且有一个标志被讄以便通知脚本开始记录用L击键Q直至用h下了回R键。无论收C么,都会回显到终端上Q一个相应的action会在脚本的终端那一部分执行?br /><br />   q些例子昄了expect的作业控制方式。通过把自己插入到对话里面Qexpect可以在进E之间创建复杂的I/O。可以创建多扇出Q复用扇入的Q动态的数据相关的进E图?br /><br />   相比之下Qshell使得它自׃ơ一行的d一个文件显的很困难。shell用户按下控制?比如Q^C,^Z)和关键字(比如fg和bg)来实C业的切换。这些都无法从脚本里面利用。相似的是:以非交互方式q行的shellq不处理“历史记录”和其他一些仅仅ؓ交互式用设计的特征。这也出C和前面哪个passwdE序的相似问题。相似的Q也无法~写能够回归的测试shell的某些动作的shell脚本。结果导致shell的这些方面无法进行彻底的试?br /><br />   如果使用expect的话Q可以用它的交互式的作业控制来驱动shell。一个派生的shell认ؓ它是在交互的q行着Q所以会正常的处理作业控制。它不仅能够解决验处理作业控制的shell和其他一些程序的问题。还能够在必要的时候,让shell代替expect来处理作业。可以支持用shell风格的作业控制来支持q程的运行。这意味着Q首先派生一个shellQ然后把命o送给shell来启动进E。如果进E被挂vQ比如说Q发送了一个^ZQ进E就会停下来Qƈ把控制返回给shell。对于expect而言Q它q在处理同一个进E?原来那个shell)?br /><br />  expect的解x法不仅具有很大的灉|性,它还避免了重复已l存在于shell中的作业控制软g。通过使用shellQ由于你可以选择你想z的shellQ所以你可以Ҏ需要获得作业控制权。而且Q一旦你需?比如说检验的时?Q你可以驱动一个shell来让q个shell以ؓ它正在交互式的运行。这一点对于在到它们是否在交互式的运行之后会改变输出的缓冲的E序来说也是很重要的?br /><br />  Zq一步的控制Q在interact执行期间Qexpect把控制终?是启动expect的那个终端,而不是伪l端)讄成生模式以便字符能够正确的传送给z的进E。当expect在没有执行interact的时候,l端处于熟模式下Q这时候作业控制就可以作用于expect本n?br /><br />11.[交互式的使用expect]<br /><br />  在前面,我们提到可以通过interact命o来交互式的用脚本。基本上来说Qinteract命o提供了对对话的自p问,但我们需要一些更_的控制。这一点,我们也可以用expect来达刎ͼ因ؓexpect从标准输入中d输入和从q程中读取输入一L单?但是Q我们要使用expect_user和send_user来进行标准I/OQ同时不改变spawn_id?br /><br />  下面的这个脚本在一定的旉内从标准输入里面d一行。这个脚本叫做timed_readQ可以从csh里面调用Q比如说Qset answer="timed_read 30"p调用它?br /><br />    #!/usr/local/bin/expect -f<br />    set timeout [index $argv 1]<br />    expect_user "* "<br />    send_user $expect_match<br /><br />   W三行从用户那里接收M以新行符l束的Q何一行。最后一行把它返回给标准输出。如果在特定的时间内没有得到M键入Q则q回也ؓI?br /><br />   W一行支?#!"的系l直接的启动脚本?如果把脚本的属性加上可执行属性则不要在脚本前面加上expect)。当然了脚本L可以昑ּ的用"expect scripot"来启动。在-c后面的选项在Q何脚本语句执行前p执行。比如说Q不要修改脚本本w,仅仅在命令行上加?c "trace..."Q该脚本可以加上trace功能?省略可Ctrace的选项)?br /><br />   在命令行里实际上可以加上多个命oQ只要中间以";"分开可以了。比如说Q下面这个命令行Q?br /><br />    expect -c "set timeout 20;spawn foo;expect"<br /><br />   一旦你把超时时限设|好而且E序启动之后Qexpect开始等待文件结束符或?0U的时旉?如果遇到了文件结束符(EOF)Q该E序׃停下来,然后expectq回。如果是遇到了超时的情况Qexpectp回。在q两中情况里面,都隐式的杀M当前q程?br /><br />   如果我们不用expect而来实现以上两个例子的功能的话,我们q是可以学习到很多的东西的。在q两中情况里面,通常的解x案都是fork另一个睡眠的子进Eƈ且用signal通知原来的shell。如果这个过E或者读先发生的话,shell׃杀叔R个睡眠的q程?传递pid和防止后台进E生启动信息是一个让除了高手UshellE序员之外的人头痛的事情。提供一个通用的方法来象这样启动多个进E会使shell脚本非常的复杂?所以几乎可以肯定的是,E序员一般都用一个专门CE序来解册样一个问题?br /><br />   expect_user,send_user,send_error(向标准错误终端输?在比较长的,用来把从q程来的复杂交互译成简单交互的expect脚本里面使用的比较频J。在参考[7]里面QLibs描述怎样用脚本来安全的包?wrap)adbQ怎样把系l管理员从需要掌握adb的细节里面解脱出来,同时大大的降低了׃错误的击键而导致的pȝ崩溃?br /><br />   一个简单的例子能够让ftp自动的从一个私人的帐号里面取文件。在q种情况里,要求提供密码?即文g的访问是受限的,你也应该避免把密码以明文的方式存储在文g里面。把密码作ؓ脚本q行时的参数也是不合适的Q因为用ps命o能看到它们。有一个解决的Ҏ是在脚本运行的开始调用expect_user来让用户输入以后可能使用的密码。这个密码必d能让q个脚本知道Q即使你是每个小旉要重试ftp?br /><br />   即信息是立卌入进ȝQ这个技巧也是非常有用。比如说Q你可以写一个脚本,把你每一个主Z不同的帐号上的密码都ҎQ不他们用的是不是同一个密码数据库。如果你要手工达到这样一个功能的话,你必Telnet到每一个主ZQƈ且手工输入新的密码。而用expect,你可以只输入密码一ơ而让脚本来做其它的事情?br /><br />   expect_user和interact也可以在一个脚本里面؜合的使用。考虑一下在调试一个程序的循环Ӟl过好多步之后才p|的情c一个expect脚本可以驱动哪个调试器,讄好断点,执行该程序@环的若干步,然后控制返回给键盘。它也可以在q回控制之前Q在循环体和条g试之间来回的切换?br /><br />6.[passwd和一致性检查]<br /><br />  在前面,我们提到passwdE序在缺乏用户交互的情况下,不能q行Qpasswd<br />会忽略I/O重定向,也不能嵌入到道里边以便能从别的E序或者文仉d?br />入。这个程序坚持要求真正的与用戯行交互。因为安全的原因Qpasswd被设?br />成这P但结果导致没有非交互式的Ҏ来检验passwd。这样一个对pȝ安全<br />臛_重要的程序竟然没有办法进行可靠的验,真实h讽刺意味?br /><br />  passwd以一个用户名作ؓ参数Q交互式的提C入密码。下面的expect?br />本以用户名和密码作ؓ参数而非交互式的q行?br /><br />    spawn oasswd [index $argv 1]<br />    set password [index $argv 2]<br />    expect "*password:"<br />    send "$password "<br />    expect "*password:"<br />    send "$password "<br />    expect eof<br /><br />  W一行以用户名做参数启动passwdE序Qؓ方便赯Q第二行把密码存?br />一个变量里面。和shellcMQ变量的使用也不需要提前声明?br /><br />  在第三行Qexpect搜烦模式"*password:"Q其?允许匚wL输入Q所<br />以对于避免指定所有细节而言是非常有效的?上面的程序里没有action,所?br />expect到该模式后ql运行?br /><br />  一旦接收到提示后,下一行就把密码送给当前q程。表明回车??br />际上Q所有的C的关于字W的U定都支?。上面的E序中有两个expect-send<br />序列Q因为passwdZ对输入进行确认,要求q行两次输入。在非交互式E序<br />里面Q这是毫无必要的Q但׃假定passwd是在和用戯行交互,所以我们的<br />脚本q是q样做了?br /><br />  最后,"expect eof"q一行的作用是在passwd的输Z搜烦文gl束W,<br />q一行语句还展示了关键字的匹配。另外一个关键字匚w是timeout了,<br />timeout被用于表C所有匹配的p|而和一D늉定长度的旉相匹配。在q里<br />eof是非常有必要的,因ؓpasswd被设计成会检查它的所有I/O是否都成功了Q?br />包括W二ơ输入密码时产生的最后一个新行?br /><br />  q个脚本已经_展示passwd命o的基本交互性。另外一个更加完备的?br />子回查别的一些行为。比如说Q下面的q个脚本p查passwdE序的别?br />几个斚w。所有的提示都进行了查。对垃圾输入的检查也q行了适当的处<br />理。进E死亡,乎d的慢响应Q或者别的非预期的行为都q行了处理?br /><br /><br />    spawn passwd [index $argv 1]<br />    expect     eof            {exit 1}     <br />        timeout            {exit 2}    <br />        "*No such user.*"    {exit 3}    <br />        "*New password:"    <br />    send "[index $argv 2 "<br />    expect     eof            {exit 4}    <br />        timeout            {exit 2}    <br />        "*Password too long*"    {exit 5}    <br />        "*Password too short*"    {exit 5}    <br />        "*Retype ew password:"<br />    send "[index $argv 3] "<br />    expect     timeout            {exit 2}    <br />        "*Mismatch*"        {exit 6}    <br />        "*Password unchanged*"    {exit 7}    <br />        " "        <br />    expect    timeout            {exit 2}    <br />        "*"            {exit 6}    <br />        eof<br /><br />   <br />  q个脚本退出时用一个数字来表示所发生的情c?表示passwdE序正常<br />q行Q?表示非预期的MQ?表示锁定Q等{。用数字是Z单v见?br />expectq回字符串和q回数字是一L单的Q即使是zE序自n产生的消?br />也是一L。实际上Q典型的做法是把整个交互的过E存C个文仉面,?br />有当E序的运行和预期一L时候才把这个文件删除。否则这个log被留待以<br />后进一步的查?br /><br />  q个passwd查脚本被设计成由别的脚本来驱动。这W二个脚本从一个文<br />仉面读取参数和预期的结果。对于每一个输入参数集Q它调用W一个脚本ƈ<br />且把l果和预期的l果相比较?因ؓq个d是非交互的,一个普通的老式<br />shell可以用来解释第二个脚本)。比如说Q一个passwd的数据文件很有可?br />p下面一栗?br /><br />    passwd.exp    3    bogus    -        -<br />    passwd.exp    0    fred    abledabl    abledabl<br />    passwd.exp    5    fred    abcdefghijklm    -<br />    passwd.exp    5    fred    abc        -<br />    passwd.exp    6    fred    foobar        bar    <br />    passwd.exp    4    fred    ^C        -<br /><br />  W一个域的名字是要被q行的回归脚本。第二个域是需要和l果相匹配的<br />退出倹{第三个域就是用户名。第四个域和W五个域是提示时应该输入的?br />码。减号仅仅表C那里有一个域Q这个域其实l对不会用到。在W一个行?br />Qbogus表示用户名是非法的,因此passwd会响应说Q没有此用户。expect?br />退出时会返?Q?恰好是W二个域。在最后一行中Q^C是被切实的送给E?br />序来验证E序是否恰当的退出?br /><br />  通过q种ҎQexpect可以用来验和调试交互式YӞq恰恰是IEEE?br />POSIX 1003.2(shell和工?的一致性检验所要求的。进一步的说明请参?br />Libes[6]?br /><br />7.[rogue 和伪l端]<br /><br />  Unix用户肯定寚w过道来和其他q程相联pȝ方式非常的熟?比如_<br />一个shell道)。expect使用伪终端来和派生的q程相联pR伪l端提供了终<br />端语义以便程序认Z们正在和真正的终端进行I/O操作?br /><br />  比如_BSD的探险游戏rogue在生模式下运行,q假定在q接的另一端是<br />一个可d的字W终端。可以用expect~程Q得通过使用用户界面可以玩这<br />个游戏?br /><br />  rogueq个探险游戏首先提供l你一个有各种物理属性,比如说力量|?br />角色。在大部分时间里Q力量值都?6Q但在几乎每20ơ里面就会有一个力?br />值是18。很多的rogue玩家都知道这一点,但没有h愿意启动E序20ơ以获得一<br />个好的配|。下面的q个脚本p辑ֈq个目的?br /><br />    for {} {1} {} {<br />        spawn rogue<br />        expect "*Str:18*"    break    <br />            "*Str:16*"    <br />        close<br />        wait<br />    }<br />    interact<br /><br />  W一行是个for循环Q和C语言的控制格式很象。rogue启动后,expect?br />查看力量值是18q是16Q如果是16Q程序就通过执行close和wait来退出?br />q两个命令的作用分别是关闭和伪终端的q接和等待进E退出。rogued一<br />个文件结束符推出,从而@环l运行,产生一个新的rogue游戏来检查?br /><br />  当一个gؓ18的配|找到后Q控制就推出循环q蟩到最后一行脚本?br />interact把控制{Uȝ用户以便他们能够玩这个特定的游戏?br /><br />  惌一下这个脚本的q行。你所能真正看到的是20或?0个初始的配置<br />在不CU钟的时间里掠过屏幕Q最后留l你的就是一个有着很好配置的游?br />。唯一比这更好的方法就是用调试工h玩游戏?br /><br />  我们很有必要认识到这样一点:rogue是一个用光标的囑Ş游戏?br />expectE序员必M解到Q光标的q动q不一定以一U直观的方式在屏q上?br />现。幸q的是,在我们这个例子里Q这不是一个问题。将来的对expect的改<br />q可能会包括一个内嵌的能支持字W图形区域的l端模拟器?br /><br />8.[ftp]<br /><br />  我们使用expect写第一个脚本ƈ没有打印?Hello,World"。实际上Q它<br />实现了一些更有用的功能。它能通过非交互的方式来运行ftp。ftp是用来在?br />持TCP/IP的网l上q行文g传输的程序。除了一些简单的功能Q一般的实现?br />要求用户的参与?br /><br />  下面q个脚本从一个主Z使用匿名ftp取下一个文件来。其中,L?br />是第一个参数。文件名是第二个参数?br /><br />        spawn    ftp    [index $argv 1]<br />        expect "*Name*"<br />        send     "anonymous "<br />        expect "*Password:*"<br />        send [exec whoami]<br />        expect "*ok*ftp>*"<br />        send "get [index $argv 2] "<br />        expect "*ftp>*"<br /><br />  上面q个E序被设计成在后台进行ftp。虽然他们在底层使用和expectc?br />似的机制Q但他们的可~程能力留待改进。因为expect提供了高U语aQ你?br />以对它进行修Ҏ满你的特定需求。比如说Q你可以加上以下功能Q?br /><br />    Q坚持-Q如果连接或者传输失败,你就可以每分钟或者每时Q甚<br />        臛_以根据其他因素,比如说用L负蝲Q来q行不定期的<br />        重试?br />    Q通知Q-传输时可以通过mail,write或者其他程序来通知你,甚至<br />        可以通知p|?br />    Q初始化Q每一个用户都可以有自q用高U语a~写的初始化文g<br />        (比如_.ftprc)。这和C shell?cshrc的用很cM?br /><br />  expectq可以执行其他的更复杂的d。比如说Q他可以使用McGill大学<br />的Archiepȝ。Archie是一个匿名的Telnet服务Q它提供ҎqInternet上可<br />通过匿名ftp获取的文件的数据库的讉K。通过使用q个服务Q脚本可以询?br />Archie某个特定的文件的位置Qƈ把它从ftp服务器上取下来。这个功能的?br />现只要求在上面那个脚本中加上几行可以?br /><br />  现在q没有什么已知的后台-ftp能够实现上面的几功能,能不要说所?br />的功能了。在expect里面Q它的实现却是非常的单。“坚持”的实现只要?br />在expect脚本里面加上一个@环。“通知”的实现只要执行mail和write可?br />了。“初始化文g”的实现可以使用一个命令,source .ftprcQ就可以了,<br />?ftprc里面可以有Q何的expect命o?br /><br />  虽然q些特征可以通过在已有的E序里面加上钩子函数可以,但这也不<br />能保证每一个h的要求都能得到满뀂唯一能够提供保证的方法就是提供一U?br />通用的语a。一个很好的解决Ҏ是把Tcl自n融入到ftp和其他的E序中间<br />厅R实际上Q这本来是Tcl的初街在q没有这样做之前Qexpect提供了一<br />个能实现大部分功能但又不需要Q何重写的Ҏ?br /><br />9.[fsck]<br /><br />  fsck是另外一个缺乏够的用户接口的例子。fsck几乎没有提供什么方?br />来预先的回答一些问题。你能做的就是给所有的问题都回{?yes"或者都回答<br />"no"?br /><br />  下面的程序段展示了一个脚本如何的使的自动的对某些问题回答"yes"Q?br />而对某些问题回答"no"。下面的q个脚本一开始先zfsckq程Q然后对?br />中两U类型的问题回答"yes"Q而对其他的问题回{?no"?br /><br />    for {} {1} {} {<br />        expect <br />            eof        break        <br />            "*UNREF FILE*CLEAR?"    {send "r "}    <br />            "*BAD INODE*FIX?"    {send "y "}    <br />            "*?"            {send "n "}    <br />    }<br /><br />  在下面这个版本里面,两个问题的回{是不同的。而且Q如果脚本遇?br />了什么它不能理解的东西,׃执行interact命o把控制交l用戗用L<br />击键直接交给fsck处理。当执行完后Q用户可以通过?+"键来退出或者把<br />控制交还lexpect。如果控制是交还l脚本了Q脚本就会自动的控制q程?br />剩余部分的运行?br /><br />    for {} {1} {}{<br />        expect             <br />            eof        break        <br />            "*UNREF FILE*CLEAR?"    {send "y "}    <br />            "*BAD INODE*FIX?"    {send "y "}    <br />            "*?"            {interact +}    <br />    }<br /><br />  如果没有expectQfsck只有在牺牲一定功能的情况下才可以非交互式?br />q行。fsck几乎是不可编E的Q但它却是系l管理的最重要的工兗许多别<br />的工L用户接口也一L不。实际上Q正是其中的一些程序的不D<br />了expect的诞生?br /><br />10.[控制多个q程Q作业控制]<br /><br /><br />  expect的作业控制概늲巧的避免了通常的实现困难。其中包括了两个?br />题:一个是expect如何处理l典的作业控Ӟ卛_你在l端上按下^Z键时<br />expect如何处理Q另外一个就是expect是如何处理多q程的?br /><br />  对第一个问题的处理是:忽略它。expect对经典的作业控制一无所知。比<br />如说Q你z了一个程序ƈ且发送一个^Zl它Q它׃停下?q是伪终端的<br />完美之处)而expect׃永远的等下去?br /><br />  但是Q实际上Q这Ҏ׃成一个问题。对于一个expect脚本Q没有必?br />向进E发送^Z。也是_没有必要停下一个进E来。expect仅仅是忽略了<br />一个进E,而把自己的注意力转移到其他的地方。这是expect的作业控?br />思想Q这个思想也一直工作的很好?br /><br />  从用L角度来看是象q样的:当一个进E通过spawn命o启动Ӟ变量<br />spawn_idp讄成某q程的描q符。由spawn_id描述的进E就被认为是?br />前进E?q个描述W恰恰就是伪l端文g的描q符Q虽然用h它当作一?br />不透明的物?。expect和send命o仅仅和当前进E进行交互。所以,切换一<br />个作业所需要做的仅仅是把该q程的描q符赋给spawn_id?br /><br />  q儿有一个例子向我们展示了如何通过作业控制来两个chessq程q行<br />交互。在z完两个进E之后,一个进E被通知先动一步。在下面的@环里<br />面,每一步动作都送给另外一个进E。其中,read_move和write_move两个q?br />E留l读者来实现?实际上,它们的实现非常的ҎQ但是,׃太长了所<br />以没有包含在q里)?br /><br />    spawn chess            ;# start player one<br />    set id1    $spawn_id<br />    expect "Chess "<br />    send "first "            ;# force it to go first<br />    read_move<br /><br />    spawn chess            ;# start player two<br />    set id2    $spawn_id<br />    expect "Chess "<br />    <br />    for {} {1} {}{<br />        send_move<br />        read_move<br />        set spawn_id    $id1<br />        <br />        send_move<br />        read_move<br />        set spawn_id    $id2<br />    }<br /><br />   有一些应用程序和chessE序不太一P在chessE序里,的两个玩?br />轮流动。下面这个脚本实C一个冒充程序。它能够控制一个终端以便用?br />能够d和正常的工作。但是,一旦系l提C入密码或者输入用户名的时<br />候,expect开始把击键C来,一直到用户按下回R键。这有效的收集了<br />用户的密码和用户名,q避免了普通的冒充E序?Incorrect password-try<br />again"。而且Q如果用戯接到另外一个主ZQ那些额外的d也会?br />记录下来?br /><br />    spawn tip /dev/tty17        ;# open connection to<br />    set tty $spawn_id        ;# tty to be spoofed<br /><br />    spawn login<br />    set login $spawn_id<br /><br />    log_user 0<br />    <br />    for {} {1} {} {<br />        set ready [select $tty $login]<br />        <br />        case $login in $ready {<br />            set spawn_id $login<br />            expect         <br />              {"*password*" "*login*"}{<br />                  send_user $expect_match<br />                  set log 1<br />                 }    <br />              "*"        ;# ignore everything else<br />            set spawn_id    $tty;<br />            send $expect_match<br />        }<br />        case $tty in $ready {<br />            set spawn_id    $tty<br />            expect "* *"{<br />                    if $log {<br />                      send_user $expect_match<br />                      set log 0<br />                    }<br />                   }    <br />                "*" {<br />                    send_user $expect_match<br />                   }<br />            set spawn_id     $login;<br />            send $expect_match<br />        }<br />    } <br />        <br /><br />   q个脚本是这样工作的。首先连接到一个loginq程和终端。缺省的Q?br />所有的对话都记录到标准输出?通过send_user)。因为我们对此ƈ不感兴趣Q?br />所以,我们通过命o"log_user 0"来禁止这个功能?有很多的命o来控?br />可以看见或者可以记录的东西)?br /><br />   在@环里面,select{待l端或者loginq程上的动作Qƈ且返回一?br />{待输入的spawn_id表。如果在表里面找C一个值的话,case执行一?br />action。比如说Q如果字W串"login"出现在loginq程的输ZQ提C就?br />被记录到标准输出上,q且有一个标志被讄以便通知脚本开始记录用L<br />击键Q直至用h下了回R键。无论收C么,都会回显到终端上Q一个相<br />应的action会在脚本的终端那一部分执行?br /><br />   q些例子昄了expect的作业控制方式。通过把自己插入到对话里面Q?br />expect可以在进E之间创建复杂的I/O。可以创建多扇出Q复用扇入的Q?br />动态的数据相关的进E图?br /><br />   相比之下Qshell使得它自׃ơ一行的d一个文件显的很困难?br />shell用户按下控制?比如Q^C,^Z)和关键字(比如fg和bg)来实C业的<br />切换。这些都无法从脚本里面利用。相似的是:以非交互方式q行的shellq?br />不处理“历史记录”和其他一些仅仅ؓ交互式用设计的特征。这也出C?br />前面哪个passwdE序的相似问题。相似的Q也无法~写能够回归的测试shell<br />的某些动作的shell脚本。结果导致shell的这些方面无法进行彻底的试?br /><br />   如果使用expect的话Q可以用它的交互式的作业控制来驱动shell。一<br />个派生的shell认ؓ它是在交互的q行着Q所以会正常的处理作业控制。它?br />仅能够解x验处理作业控制的shell和其他一些程序的问题。还能够在必?br />的时候,让shell代替expect来处理作业。可以支持用shell风格的作业控<br />制来支持q程的运行。这意味着Q首先派生一个shellQ然后把命o送给shell<br />来启动进E。如果进E被挂vQ比如说Q发送了一个^ZQ进E就会停下来Qƈ<br />把控制返回给shell。对于expect而言Q它q在处理同一个进E?原来那个<br />shell)?br /><br />  expect的解x法不仅具有很大的灉|性,它还避免了重复已l存在于<br />shell中的作业控制软g。通过使用shellQ由于你可以选择你想z的shellQ?br />所以你可以Ҏ需要获得作业控制权。而且Q一旦你需?比如说检验的?br />?Q你可以驱动一个shell来让q个shell以ؓ它正在交互式的运行。这一<br />点对于在到它们是否在交互式的运行之后会改变输出的缓冲的E序来说?br />是很重要的?br /><br />  Zq一步的控制Q在interact执行期间Qexpect把控制终?是启?br />expect的那个终端,而不是伪l端)讄成生模式以便字符能够正确的传送给<br />z的进E。当expect在没有执行interact的时候,l端处于熟模式下Q这?br />候作业控制就可以作用于expect本n?br /><br />11.[交互式的使用expect]<br /><br />  在前面,我们提到可以通过interact命o来交互式的用脚本。基本上<br />来说Qinteract命o提供了对对话的自p问,但我们需要一些更_的控<br />制。这一点,我们也可以用expect来达刎ͼ因ؓexpect从标准输入中d<br />输入和从q程中读取输入一L单?但是Q我们要使用expect_user?br />send_user来进行标准I/OQ同时不改变spawn_id?br /><br />  下面的这个脚本在一定的旉内从标准输入里面d一行。这个脚本叫<br />做timed_readQ可以从csh里面调用Q比如说Qset answer="timed_read 30"<br />p调用它?br /><br />    #!/usr/local/bin/expect -f<br />    set timeout [index $argv 1]<br />    expect_user "* "<br />    send_user $expect_match<br /><br />   W三行从用户那里接收M以新行符l束的Q何一行。最后一行把?br />q回l标准输出。如果在特定的时间内没有得到M键入Q则q回也ؓI?br /><br />   W一行支?#!"的系l直接的启动脚本?如果把脚本的属性加上可?br />行属性则不要在脚本前面加上expect)。当然了脚本L可以昑ּ的用<br />"expect scripot"来启动。在-c后面的选项在Q何脚本语句执行前p执行?br />比如_不要修改脚本本nQ仅仅在命o行上加上-c "trace..."Q该脚本?br />以加上trace功能?省略可Ctrace的选项)?br /><br />   在命令行里实际上可以加上多个命oQ只要中间以";"分开可以了?br />比如_下面q个命o行:<br /><br />    expect -c "set timeout 20;spawn foo;expect"<br /><br />   一旦你把超时时限设|好而且E序启动之后Qexpect开始等待文?br />l束W或?0U的时旉?如果遇到了文件结束符(EOF)Q该E序׃?br />下来Q然后expectq回。如果是遇到了超时的情况Qexpectp回。在q两<br />中情况里面,都隐式的杀M当前q程?br /><br />   如果我们不用expect而来实现以上两个例子的功能的话,我们q是?br />以学习到很多的东西的。在q两中情况里面,通常的解x案都是fork另一?br />睡眠的子q程q且用signal通知原来的shell。如果这个过E或者读先发生的<br />话,shell׃杀叔R个睡眠的q程?传递pid和防止后台进E生启动信?br />是一个让除了高手UshellE序员之外的人头痛的事情。提供一个通用的方?br />来象q样启动多个q程会shell脚本非常的复杂?所以几乎可以肯定的是,<br />E序员一般都用一个专门CE序来解册样一个问题?br /><br />   expect_user,send_user,send_error(向标准错误终端输?在比较长<br />的,用来把从q程来的复杂交互译成简单交互的expect脚本里面使用的比?br />频繁。在参考[7]里面QLibs描述怎样用脚本来安全的包?wrap)adbQ怎样<br />把系l管理员从需要掌握adb的细节里面解脱出来,同时大大的降低了׃?br />误的击键而导致的pȝ崩溃?br /><br />   一个简单的例子能够让ftp自动的从一个私人的帐号里面取文件。在q?br />U情况里Q要求提供密码?即文g的访问是受限的,你也应该避免把密?br />以明文的方式存储在文仉面。把密码作ؓ脚本q行时的参数也是不合适的Q?br />因ؓ用ps命o能看到它们。有一个解决的Ҏ是在脚本运行的开始调?br />expect_user来让用户输入以后可能使用的密码。这个密码必d能让q个?br />本知道,即你是每个时都要重试ftp?br /><br />   即信息是立卌入进ȝQ这个技巧也是非常有用。比如说Q你?br />以写一个脚本,把你每一个主Z不同的帐号上的密码都ҎQ不他们?br />的是不是同一个密码数据库。如果你要手工达到这样一个功能的话,你必?br />Telnet到每一个主ZQƈ且手工输入新的密码。而用expect,你可以只?br />入密码一ơ而让脚本来做其它的事情?br /><br />   expect_user和interact也可以在一个脚本里面؜合的使用。考虑一?br />在调试一个程序的循环Ӟl过好多步之后才p|的情c一个expect脚本<br />可以驱动哪个调试器,讄好断点,执行该程序@环的若干步,然后控?br />q回l键盘。它也可以在q回控制之前Q在循环体和条g试之间来回的切<br />换?<img src ="http://www.aygfsteel.com/weidagang2046/aggbug/37412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/weidagang2046/" target="_blank">weidagang2046</a> 2006-03-25 23:24 <a href="http://www.aygfsteel.com/weidagang2046/articles/37412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文本提取q输出到文ghttp://www.aygfsteel.com/weidagang2046/articles/37181.htmlweidagang2046weidagang2046Fri, 24 Mar 2006 04:23:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/37181.htmlhttp://www.aygfsteel.com/weidagang2046/comments/37181.htmlhttp://www.aygfsteel.com/weidagang2046/articles/37181.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/37181.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/37181.html # !/usr/bin/perl -w

@ARGV   >   0   ||   die   " Usage:\nperl $0 [file] " ;

open (INH ,   " <$ARGV[0] " ||   die   " Can't open file $ARGV[0]\n " ;
open (OUTH ,   " >d:/log.txt " ||   die   " Can't open file d:/log.txt\n " ;

while ( $line   =   < INH > )
{
    
if ( $line   =~   " GTS MS FSM "   ||   $line   =~   " GTS RPM PFC "   ||   $line   =~   " -> " )
    {
        
print  OUTH  $line ;
    }
}

close (INH);
close (OUTH);

weidagang2046 2006-03-24 12:23 发表评论
]]>
适应度计脚?/title><link>http://www.aygfsteel.com/weidagang2046/articles/37121.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Thu, 23 Mar 2006 16:06:00 GMT</pubDate><guid>http://www.aygfsteel.com/weidagang2046/articles/37121.html</guid><wfw:comment>http://www.aygfsteel.com/weidagang2046/comments/37121.html</wfw:comment><comments>http://www.aygfsteel.com/weidagang2046/articles/37121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/weidagang2046/comments/commentRss/37121.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/weidagang2046/services/trackbacks/37121.html</trackback:ping><description><![CDATA[数据文g׃列数字组成,列间q格隔开?br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">#</span><span style="COLOR: #008000">!/usr/bin/perl -w</span><span style="COLOR: #008000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #800080">$arg_num</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">@ARGV</span><span style="COLOR: #000000">;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #800080">$arg_num</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">0</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">die</span><span style="COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000">Usage:\nperl $0 [file]\n</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">open</span><span style="COLOR: #000000">(FH</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$ARGV</span><span style="COLOR: #000000">[</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">]) </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">die</span><span style="COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000">Can't open file $ARGV[0]\n</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #800080">@lines</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">FH</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$line</span><span style="COLOR: #000000"> (</span><span style="COLOR: #800080">@lines</span><span style="COLOR: #000000">)<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">chomp</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$line</span><span style="COLOR: #000000">);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #800080">@nums</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">split</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #000000">'</span><span style="FONT-WEIGHT: bold; COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$line</span><span style="COLOR: #000000">);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #800080">$fitness</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">1</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">abs</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$nums</span><span style="COLOR: #000000">[</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$nums</span><span style="COLOR: #000000">[</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">]) </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">abs</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$nums</span><span style="COLOR: #000000">[</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">]) </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">1e-10</span><span style="COLOR: #000000">);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #800080">$count</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />}<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$count</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">)<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #800080">$fitness</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$count</span><span style="COLOR: #000000">;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$fitness</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000">\n</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />}<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000">0\n</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />}</span></div><img src ="http://www.aygfsteel.com/weidagang2046/aggbug/37121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/weidagang2046/" target="_blank">weidagang2046</a> 2006-03-24 00:06 <a href="http://www.aygfsteel.com/weidagang2046/articles/37121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获取pȝ定义的所有信号名http://www.aygfsteel.com/weidagang2046/articles/36916.htmlweidagang2046weidagang2046Wed, 22 Mar 2006 12:37:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/36916.htmlhttp://www.aygfsteel.com/weidagang2046/comments/36916.htmlhttp://www.aygfsteel.com/weidagang2046/articles/36916.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/36916.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/36916.html use  Config;

defined   $Config {sig_name}  ||   die   " No sig?\n " ;

foreach   $name  ( split ( '   ' ,   $Config {sig_name}))
{
    
print   $name ,   " \n " ;
}


weidagang2046 2006-03-22 20:37 发表评论
]]>
q制转换以及字符串{整数http://www.aygfsteel.com/weidagang2046/articles/35887.htmlweidagang2046weidagang2046Fri, 17 Mar 2006 15:31:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/35887.htmlhttp://www.aygfsteel.com/weidagang2046/comments/35887.htmlhttp://www.aygfsteel.com/weidagang2046/articles/35887.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/35887.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/35887.htmlAuthor: kbe@www.smth.org

Converting Between Octal and Hexadecimal

# -----------------------------
$number   =   hex ( $hexadecimal );          #  hexadecimal
$number   =   oct ( $octal );                #  octal
#-----------------------------

print   " Gimme a number in decimal, octal, or hex:  " ;
$num   =   < STDIN > ;
chomp   $num ;
exit   unless   defined   $num ;
$num   =   oct ( $num if   $num   =~   /^ 0 / #  does both oct and hex
printf   " %d %x %o\n " ,   $num ,   $num ,   $num ;
# -----------------------------
print   " Enter file permission in octal:  " ;
$permissions   =   < STDIN > ;
die   " Exiting \n "   unless   defined   $permissions ;
chomp   $permissions ;
$permissions   =   oct ( $permissions );    #  permissions always octal
print   " The decimal value is $permissions\n " ;
# -----------------------------


weidagang2046 2006-03-17 23:31 发表评论
]]>
splithttp://www.aygfsteel.com/weidagang2046/articles/35848.htmlweidagang2046weidagang2046Fri, 17 Mar 2006 09:45:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/35848.htmlhttp://www.aygfsteel.com/weidagang2046/comments/35848.htmlhttp://www.aygfsteel.com/weidagang2046/articles/35848.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/35848.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/35848.html # !/usr/bin/perl

@strs ;
push ( @strs ,   " |a |b|c| " );
push ( @strs ,   " a|b|c| " );
push ( @strs ,   " a|b|c " );

for ( $i   =   0 $i   <   @strs $i ++ )
{
    
if ( $strs [ $i =~   /^\|/ )
    {
        
$strs [ $i =   substr ( $strs [ $i ] ,   1 );
    }
    
@elems   =   split ( /\|/,   $strs [ $i ]);
    
print   @elems   +   0 ,   " \n " ;
    
print   join ( " , " ,   @elems );
    
print   " \n " ;
}


weidagang2046 2006-03-17 17:45 发表评论
]]>
自动FTP脚本http://www.aygfsteel.com/weidagang2046/articles/34754.htmlweidagang2046weidagang2046Fri, 10 Mar 2006 16:04:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/34754.htmlhttp://www.aygfsteel.com/weidagang2046/comments/34754.htmlhttp://www.aygfsteel.com/weidagang2046/articles/34754.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/34754.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/34754.htmluse strict;
use Net::FTP;

my $ftp = Net::FTP->new($HOST) or die "Cannot connect to $HOST: $@";
$ftp->login($USER,$PASS) or die "Cannot login ", $ftp->message;
$ftp->ascii;
$ftp->cwd($PATH);

foreach my $file (@file_list) {
    
my $remote_file = $file.'.txt';
    
my $local_file = $LOCAL_PATH."/$remote_file";
    
if ($ftp->size($remote_file)) {
        
$ftp->get($remote_file,$local_file) or die "get failed ", $ftp->message;
    }
}

$ftp->quit;


weidagang2046 2006-03-11 00:04 发表评论
]]>
用grep函数提取文g中符合规则的?/title><link>http://www.aygfsteel.com/weidagang2046/articles/34407.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Thu, 09 Mar 2006 01:19:00 GMT</pubDate><guid>http://www.aygfsteel.com/weidagang2046/articles/34407.html</guid><wfw:comment>http://www.aygfsteel.com/weidagang2046/comments/34407.html</wfw:comment><comments>http://www.aygfsteel.com/weidagang2046/articles/34407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/weidagang2046/comments/commentRss/34407.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/weidagang2046/services/trackbacks/34407.html</trackback:ping><description><![CDATA[提取以ID(?字符Q首字符为数字,其余三个字符为数字或字母)Qchain或region开始的行:<BR><BR>1i95<BR>complexed with ede, mg, wo2, zn <BR>chain q [62030]  <BR>1e7z <BR>contains C-terminal His tag <BR>complexed with hg <BR>chain a [25318]  <BR>1khi  <BR>region a:103-173 [77409]  <BR>1fgu   <BR>the N-terminal two domains free <BR>region a:181-298 [25296]  <BR>region a:299-426 [25297]  <BR>region b:181-289 [25298]  <BR>region b:298-426 [25299]  <BR>1hnz  <BR>complexed with hyg, mg, zn <BR>chain q [25354]  <BR>1gd7  <BR>chain a [60441]  <BR>chain b [60442]  <BR>chain c [60443]  <BR>chain d [60444]<BR><BR> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #800080">$file</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #800080">$ARGV</SPAN><SPAN style="COLOR: #000000">[</SPAN><SPAN style="COLOR: #800000">0</SPAN><SPAN style="COLOR: #000000">];<BR><BR></SPAN><SPAN style="COLOR: #0000ff">open</SPAN><SPAN style="COLOR: #000000">(FH</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #800080">$file</SPAN><SPAN style="COLOR: #000000">) </SPAN><SPAN style="COLOR: #000000">||</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">die</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="FONT-WEIGHT: bold; COLOR: #000000">"</SPAN><SPAN style="FONT-WEIGHT: bold; COLOR: #000000">Can not open $file: $!\n</SPAN><SPAN style="FONT-WEIGHT: bold; COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><BR></SPAN><SPAN style="COLOR: #800080">@lines</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000"><</SPAN><SPAN style="COLOR: #000000">FH</SPAN><SPAN style="COLOR: #000000">></SPAN><SPAN style="COLOR: #000000">;<BR><BR></SPAN><SPAN style="COLOR: #800080">@extract</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">grep</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #000000">^\</SPAN><SPAN style="COLOR: #000000">d</SPAN><SPAN style="COLOR: #000000">\</SPAN><SPAN style="COLOR: #000000">w{</SPAN><SPAN style="COLOR: #800000">3</SPAN><SPAN style="COLOR: #000000">}$)</SPAN><SPAN style="COLOR: #000000">|</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #000000">^</SPAN><SPAN style="COLOR: #000000">(chain</SPAN><SPAN style="COLOR: #000000">|</SPAN><SPAN style="COLOR: #000000">region))</SPAN><SPAN style="COLOR: #000000">/,</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #800080">@lines</SPAN><SPAN style="COLOR: #000000">);<BR><BR></SPAN><SPAN style="COLOR: #0000ff">print</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #800080">@extract</SPAN><SPAN style="COLOR: #000000">;</SPAN></DIV><img src ="http://www.aygfsteel.com/weidagang2046/aggbug/34407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/weidagang2046/" target="_blank">weidagang2046</a> 2006-03-09 09:19 <a href="http://www.aygfsteel.com/weidagang2046/articles/34407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">߰</a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʯʨ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ϴ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank">ͭϿ</a>| <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ֺ</a>| <a href="http://" target="_blank">ľ</a>| <a href="http://" target="_blank">山</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">Ұ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Զ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">°Ͷ</a>| <a href="http://" target="_blank">֦</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ȫ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>