Perl技巧
项目里面一直用的是Perl,Perl里有各种小技巧就分享在这吧。
push(@a, $b)
把b元素压入a数组中,
还可以有
push(@a, [@b]);
那a就成了二维数组了
scalar(@a);
my $b = @a;
a的长度
=~的正则匹配时
=~s///g全局替换
=//i匹配,$1,$2对应第一个,第二个捕获组
opendir
readdir
遍历目录
my($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst)=localtime(time());
时间
use Encode; sub gbk2utf8()
{
return encode('utf-8', decode('gbk', $_[]));
}
编码转换
Guess
猜测编码(用法略)
$a=<STDIN>
从标准读入读入一行
神奇的Tk库,详见
http://search.cpan.org/~srezic/Tk-804.033/Tk.pod
图形界面,虽然比较挫
强推目录选择的小工具
chooseDirector
use Tk; #新建一个窗口
my $mw = MainWindow->new;
#把主窗口隐藏
$mw->iconify;
#选择一个目录
my $dir = $mw->chooseDirectory(-title => encode('gbk', decode('utf-8', '请选择你要检查的目录')), -initialdir => '.\..\app');
Tk窗口控制
$mw->iconify; # Minimize
$mw->deiconify; # Restore
$mw->state('withdrawn'); # Hide
$mw->state('normal'); # Show
use Net::TcpDumpLog;
use NetPacket::Ethernet;
use NetPacket::TCP;
use NetPacket::UDP;
解析pcap文件
#获取唯一标识一条流的五元组信息:src_ip, dest_ip, src_port, dest_port, l4_protocol
sub get_stream_key {
my ($raw_pkt) = @_;
my ($eth_obj, $ip_obj, $tcp_obj, $udp_obj);
my $l4_protocol;
my %stream_key = (); #解析当前包;
$eth_obj = NetPacket::Ethernet->decode($raw_pkt);
$ip_obj = NetPacket::IP->decode($eth_obj->{data});
$stream_key{"src_ip"} = $ip_obj->{src_ip};
$stream_key{"dest_ip"} = $ip_obj->{dest_ip};
$stream_key{"proto"} = $ip_obj->{proto};
$l4_protocol = $ip_obj->{proto};
if ($l4_protocol eq NetPacket::IP::IP_PROTO_TCP)
{
$tcp_obj = NetPacket::TCP->decode($ip_obj->{data});
$stream_key{"src_port"} = $tcp_obj->{src_port};
$stream_key{"dest_port"} = $tcp_obj->{dest_port};
$stream_key{"data"} = $tcp_obj->{data};
}
elsif ($l4_protocol eq NetPacket::IP::IP_PROTO_UDP)
{
$udp_obj = NetPacket::UDP->decode($ip_obj->{data});
$stream_key{"src_port"} = $udp_obj->{src_port};
$stream_key{"dest_port"} = $udp_obj->{dest_port};
$stream_key{"data"} = $udp_obj->{data};
} return %stream_key;
}
YAML::Syck
解析YAML文件
foreach 哈希数组 排序
foreach my $key (sort {$a cmp $b} keys %$data)
use Spreadsheet::XLSX;
解析xlsx
初始化
my $converter = Text::Iconv->new ("utf-8", "GBK");
my $excel = Spreadsheet::XLSX->new ($filename, $converter);
遍历表(那个逻辑或实在是没有看懂)
foreach my $sheet (@{$excel->{Worksheet}})
{
$sheet->{MaxRow} ||= $sheet->{MinRow};
foreach my $row ($sheet->{MinRow} .. $sheet->{MaxRow})
{
$sheet->{MaxCol} ||= $sheet->{MinCol};
foreach my $col ($sheet->{MinCol} .. $sheet->{MaxCol})
{
my $cell = $sheet->{Cells} [$row] [$col];
if ($cell)
{
my $val = $cell->{Val};
}
}
}
}
解析XML
use XML::Simple;
my $xmldata = XMLin($xmlname);
SSH协议
推荐使用Net::SSH2
虽然这个还是很不好使
use Net::SSH2;
#登陆服务器
my $ssh = Net::SSH2->new();
#$ssh->debug(1);
$ssh->connect($host);
if (!($ssh->auth_password($user, $passwd)))
{
print "Login Failed\n";
system('pause');
exit();
}
执行命令(这个是复制过来的,来源未知)
$print不为0时,会直接在屏幕上打印
sub cmd {
my ($ssh, $print, $cmd) = @_;
my $timeout = ;
my $bufsize = ;
#needed for ssh->channel
$ssh->blocking();
my $chan=$ssh->channel();
$chan->exec($cmd);
# defin polling context: will poll stdout (in) and stderr (ext)
my $poll = [{ handle => $chan, events => ['in','ext'] }];
# hash of strings. store stdout/stderr results
my %std=();
$ssh->blocking( ); # needed for channel->poll
while(!$chan->eof) {
$ssh->poll($timeout, $poll);
# number of bytes read (n) into buffer (buf)
my( $n, $buf );
foreach my $ev (qw(in ext)) {
next unless $poll->[]{revents}{$ev};
#there are something to read here, into $std{$ev} hash
#got n byte into buf for stdout ($ev='in') or stderr ($ev='ext')
if( $n = $chan->read($buf, $bufsize, $ev eq 'ext') ) {
$std{$ev} .= $buf;
if ($print & ($ev eq 'in'))
{
print encode("gbk", decode('utf-8', $buf));
}
}
}
}
$chan->wait_closed(); #not really needed but cleaner
my $exit = $chan->exit_status();
$chan->close(); #not really needed but cleaner
$ssh->blocking(); # set it back for sanity (future calls)
return ($std{in}, $std{ext}, $exit);
}
FTP协议
use Net::FTP;
my $ftp = Net::FTP->new('$ip') or die "Cannot connect.\n";
$ftp->login('$user', '$pw') or die "Could not login.\n";
$ftp->binary;
$ftp->put($filename) or die "Upload failed\n";
$ftp->quit;
TELNET协议
比较蛋疼,写等写等这种模式好像靠谱些
use Net::Telnet;
my $tel = new Net::Telnet (Timeout => );
$tel->open('$ip') or die "Connect NetCore failed\n";
$tel->waitfor('...');
$tel->print('...');
$tel->waitfor('...');
$tel->print('...');
$tel->waitfor('...');
$tel->print('...');
当前路径
注意C大写
use Cwd;
my $path = getcwd();
正则匹配 修饰符
i 完成不区分大小写的搜索
g 查找所有出现(all occurrences,完成全局搜索)
m 将一个字符串视为多行(m就标识多multiple)。默认情况下,^和$字符串匹配字符串中的最开始和最末尾。使用m修饰符将使^和$匹配字符串中每行的开始
s 将一个字符串视为一行,忽略其中的所有换行符;他与m修饰符正好相反
X 忽略正则表达式中的空白和注释
U 第一次匹配后停止,许多量词很"贪婪",将尽可能的完成匹配。而不是在第一次匹配后停止。利用这个修饰符,可以让它们"不再贪婪"
转自 http://www.cnblogs.com/wk0423/archive/2011/04/17/2018957.html
if 参数
检测选项含义
-r 文件或目录对此(有效的)用户(effective user)或组是可读的
-w 文件或目录对此(有效的)用户或组是可写的
-x 文件或目录对此(有效的)用户或组是可执行的
-o 文件或目录由本(有效的)用户所有
-R 文件或目录对此用户(real user)或组是可读的
-W 文件或目录对此用户或组是可写的
-X 文件或目录对此用户或组是可执行的
-O 文件或目录由本用户所有
-e 文件或目录名存在
-z 文件存在,大小为0(目录恒为false)
-s 文件或目录存在,大小大于0(值为文件的大小,单位:字节)
-f 为普通文本
-d 为目录
-l 为符号链接
-S 为socket
-p 为管道(Entry is a named pipe(a“fifo”))
-b 为block-special 文件(如挂载磁盘)
-c 为character-special 文件(如I/O 设备)
-u setuid 的文件或目录
-g setgid 的文件或目录
-k File or directory has the sticky bit set
-t 文件句柄为TTY(系统函数isatty()的返回结果;不能对文件名使用这个测试)
-T 文件有些像“文本”文件
-B 文件有些像“二进制”文件
-M 修改的时间(单位:天)
-A 访问的时间(单位:天)
-C 索引节点修改时间(单位:天)
转自 http://blog.sina.com.cn/s/blog_4a082449010112h8.html
Perl技巧的更多相关文章
- 第17章课后题(高级Perl技巧)
17.1 写一个程序,从文件中读取一组字符串(每行一个),然后让用户键入模式以便进行字符串匹配. 对于每个模式,程序应该说明文件里共有多少字符串匹配成功,分别是哪些字符串. 对于所键入的每个新模式,不 ...
- Perl 语法 - 基础
perl语言的核心是正则表达式,在文本处理上非常有优势,与python类似,但语法不同,perl的语法很灵活,用多了才会觉得好用. 常用知识点总结: perl语法类似于C语言(perl源于Unix), ...
- Perl语言入门(中文版)(第6版) 东南大学出版社
第一章简介 问题与答案 这本书适合你吗? 为何有这么多的脚注? 关于习题和解答? 习题前标的数字是什么意思? 如果我是Perl讲师? “Perl”这个词表示什么意思? Larry为什么要创造Perl? ...
- Perl语言入门14-17
---------第十四章 字符串与排序------------------- index查找子字符串 my $stuff = "howdy world!"; my $where ...
- Perl_实用报表提取语言
Perl 语法 - 基础 perl语言的核心是正则表达式,在文本处理上非常有优势,与python类似,但语法不同,perl的语法很灵活,用多了才会觉得好用. 常用知识点总结: perl语法类似于C ...
- perl 爬虫两个技巧
<pre name="code" class="cpp">jrhmpt01:/root/lwp# cat data.html <div cla ...
- Perl的debug小技巧
进入Perl的调试环境的命令: Perl -d perl_file 设置断点:b + perl代码中的行号. 执行到断点:c 表示continue until breakpoint. 执行下一条 ...
- 精通Perl(第2版)
精通Perl(第2版)(通往Perl大师之路必读经典书籍,体现了一种编程思维,能够帮你解决很多实际的问题) [美]brian d foy(布瑞恩·D·福瓦)著 王兴宇 刘宸宇 译 ISBN 978 ...
- perl基本语法--转载
http://www.cnblogs.com/zhtxwd/archive/2012/03/06/2381585.html 本文介绍从变量类型.操作运算符.控制叙述.子程序.I/O和档案处理. Reg ...
随机推荐
- log4jWARN Please initialize the log4j system properly解决办法
原因是没有对log4j这个jar进行文件配置. 要解决这个问题非常简单,建立LOG4J 的配置文件即可.在src 目录下创建配置文件,选择菜单File > New > File,文件名输入 ...
- 使用自定义标签模拟jstl的<c:for each>标签
一.自定义标签的基本编写 下面编写一个自定义标签,它可以输出当前的时间. 1.编写标签类 类可以通过继承SimpleTagSupport类实现一个标签类编写.父类为我们提供了一些编写自定义标签的快捷的 ...
- js之事件冒泡和事件捕获
(1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div ...
- js 刷新窗口
在js 方法里面 1.window.opener.location.reload() 刷新父窗口 2.window.location.reload() 该方法强迫浏览器刷新当前 ...
- [WPF]DataGridHyperlinkColumn网址过长TextTrimming无效
<DataGridHyperlinkColumn Binding="{Binding source}" Header="来源"> <DataG ...
- vue 2.0
vue2.0 据说也出了很久了,博主终于操了一次实刀. 整体项目采用 vue + vue-router + vuex (传说中的vue 全家桶 ),构建工具使用尤大大推出的vue-cli 项目是 ...
- lua实现私有函数
本文是原创文章,如需转载,请注明文章出处 要用lua实现私有函数,关键就是使用metatable的特性来实现. Test.lua: local v = {};v.x = 100;v.y = 200; ...
- AS3和js相互通信要点分析
目标:在html页面里可以使用事件来影响到swf文件的内容,swf文件也可以影响html里js代码的内容 一.新建flash文件,用Flash CC试用版新建一个TextArea.fla的源文件,不添 ...
- 如何用JS判断推广链接所属的客服
今天有一个客户提出一个需求:网站有多个在线客服,每个客服都有自己的网站推广链接,当访客通过该客服的推广链接进入网站时,必须指定由该客服接待. 我的实现思路是获取推广链接中特定字符,然后判断字符对应的客 ...
- css学习归纳总结(二) 转
原文地址:css学习归纳总结(二) 标签与元素 <p>标签和p元素有什么区别呢?大多数时候他们表示的是同一样东西,但仍有细微的区别.<p>.<div>等指的是HTM ...