转载http://www.linuxtone.org/thread-1600-1-1.html
1.查询系统已经安装的perl模块
find `perl -e 'print "@INC"'` -name '*.pm' -print
2.提取文件中连续的一段区域,且末行不显示
方法一:使用shell
sed -n '/start/,/end/p' file | sed -n '$!p'
方法二:使用perl
if ( (/$start/ .. /$end/) and !/$end/ )
{
};
示例:文件file.txt内容如下
+ CNC
menu = 网通
title = 网通
++ shanghai
menu = 上海
title = shanghai
host = 210.51.63.118
++ jiangsu
menu = 江苏
title = jiangsu
host = 122.193.15.2
要求:提取内容如下
++ shanghai
menu = 上海
title = shanghai
host = 210.51.63.118
shell做法:
[root@localhost ~]# sed -n '/\+\+ shanghai/,/\+\+ jiangsu/p' file.txt | sed -n '$!p'
++ shanghai
menu = 上海
title = shanghai
host = 210.51.63.118
perl的做法:
[root@localhost ~]# cat 1.pl
#!/usr/bin/perl
use strict;
open(FH,"file.txt");
my $start= qr/\+\+ shanghai/;
my $end= qr/\+\+ jiangsu/;
while(<FH>){
if ( /$start/../$end/ and !/$end/ )
{
print $_;
}
}
close(FH);
[root@localhost ~]# ./1.pl
++ shanghai
menu = 上海
title = shanghai
host = 210.51.63.118
3. hash参数传递
#!/usr/bin/perl -w
use strict;
sub dis{
my(%hash)=@_;
my $c=$hash{a};
my $d=$hash{b};
return $c*$d;
}
print dis(a=>6,b=>5);
输出结果是30
4.perl 特殊变量翻译中文版,这个不错
http://bbs.chinaunix.net/viewthr ... p%3Bfilter%3Ddigest
5.perl中的 " -> " 符号作用
-> 有两种用法,都和解引用有关。
第一种用法,就是解引用。
根据 -> 后面跟的符号的不同,解不同类型的引用,
->[] 表示解数组引用,->{} 表示解散列引用,->() 表示解子程序引用。
例子:
$arr_ref = \@array;
$arr_ref->[0] 访问数组 @array 的第一个元素。
$hash_ref = \%hash;
$hash_ref->{foo} 访问 %hash 的 foo 分量
$sub_ref = \&test;
$sub_ref->(1, 2, 3) 使用参数列表 (1,2,3) 来调用 &test 这个子程序。
第二种用法,就是调用类或者对象的方法。
格式:
$obj->method();
或者
ClassName->method();
例如:
$pop3->login( $username, $password );
my $ftp = Net::FTP->new("some.host.name", Debug => 0);
这两种用法略有不同,
假设 -> 的左操作数(就是左边那个值,如 $pop3 和 Net::FTP)是 $left,右操作数(就是右边那个值,如 login 和 new)是 $right,那么 -> 的运算规则就是:
if ( ref $left 有效 ){ # 也就是说 $left 是个引用,而不是个裸字
$ClassName = ref $left; # 取引用的类型,当作类名称
}
else{
$ClassName = $left; # 直接把裸字当作类名称
}
然后调用:
&{$ClassName::$right}( $left, 原参数列表 )
也就是说把类名称和右操作数拼在一起,当作子程序名称(注),并把左操作数当作第一个参数。
注:Perl 解释器要做的工作其实要比这复杂,它还要考虑到继承的问题。
6.perl 夹带(小手册),很不错
http://bbs.chinaunix.net/viewthr ... p%3Bfilter%3Ddigest
7.杀进程的一些参考
(1):
$username =`whoami`;
chomp($username);
@aa = `ps -ef|grep $username|grep -v grep |grep -v ps|cut -c8-14`;
for(@aa){
chomp;
next unless /^\d+$/;
kill 9
}
(2)
fuser -n tcp 80 查看80端口运行的所有进程
fuser -k -n tcp 80 杀死80端口的所有进程
lsof -i :80|grep -v PID|awk '{print "kill -9", $2}'|sh 同上
lsof -i :80|grep -v PID|awk '{print $2}'|xargs kill -9 同上
ps -fe |grep httpd|grep -v grep|awk '{print $2}'|xargs kill -9 杀死httpd所有进程
ps -fe |grep httpd|grep -v grep|awk '{print "kill -9 " $2}'|sh 杀死httpd所有进程
ps aux|awk '{if($8=="Z") print $2 }'|xargs kill -9 查找Z表示僵死状态。
8.Perl 对象 中文翻译
http://bbs.chinaunix.net/viewthr ... p%3Bfilter%3Ddigest
9.扫描开放的tcp端口脚本
#!/usr/bin/perl
$|=1;
$tghost = shift || $ENV{"HOSTNAME"};
$maxprt = shift || 1024;
$AF_INET=2;
$SOCK_STREAM=1;
$sockaddr='S n a4 x8';
($name,$aliases,$proto)=getprotobyname('tcp');
foreach $port (1 .. $maxprt)
{
($name,$aliases,$type,$len,$thataddr)=gethostbyname($tghost);
$this=pack($sockaddr,$AF_INET,0,$thisaddr);
$that=pack($sockaddr,$AF_INET,$port,$thataddr);
die "unknown host $tghost\n" if($thataddr eq "");
socket(S,$AF_INET,$SOCK_STREAM,$proto) or die $!;
bind(S,$this) or die $!;
if(connect(S,$that))
{
($srv_name, $srv_aliases, undef, undef)=getservbyport($port,'tcp');
printf("%5d %s\n", $port, $srv_name || "unknown serv");
close(S);
}
}
exit 0;
10. perl 脚本语法检查
perl -c script.pl
11. 查看shell脚本运行过程
sh -x script.sh