设为首页 收藏本站
查看: 823|回复: 0

[经验分享] Learning Perl 5-debugoo

[复制链接]

尚未签到

发表于 2018-9-1 06:24:53 | 显示全部楼层 |阅读模式
  1. 文件测试操作符
warning &quot;Oops, A file called '$filename' already exists。\n&quot; if -e $filename;warning &quot;Config file is looking pretty old!\n&quot; if -M CONFIG >28将超过90天没有访问,且大于100KB的文件归档到磁带。my @original_files = qw /Fred barney betty/;my @big_old_files;foreach my $filename (@original_files) {#这里使用my,则$filename就在循环块中有效push @big_old_files, $filenameif -s $filename > 100_000 and -A $filename > 90;}$my_file_size_inM = ( -s $filename ) / ( 1024 * 1024 )#一定要用括号扩起来如果需要对一个文件进行多项属性测试,用虚拟文件句柄_来使用上次查询过的文件来做当前的测试。例如if( -r $file and -w _){...}或者使用栈式文件操作符:if( -w -r $file ) {...}#最靠近文件名的操作符会最先执行但是涉及到返回值的不要用栈式操作符,例如if( -s -d $filename < 512 ) {...}#等同于if( ( -d $file and -s _ ) < 512 ) {...} 文件操作符(转自http://bdxnote.blog.163.com/blog/static/84442352008317113915957/)一、文件权限测试UNIX和LINUX系统中有用户ID和组ID,Windows系统中有用户名和组名,它们的含义分别相同;在UNIX/LINUX系统中,用户ID和组ID都有两种:有效ID和实际ID;登录系统时所使用的ID是实际ID,而有效ID则是当前执行进程的ID,可以在执行程序期间改变;如果Perl5程序要复位用户ID和组ID,那么新的用户ID和组ID就会成为进程的有效ID;有效ID常用于对进程提供更多文件访问权限,但是每个文件的有效ID和实际ID有不同的权限;操作符     描述-r              是否可读-w             是否可写-x              是否可执行-o             是否拥有该文件-R            是否只有“真正的用户”可读-W           是否只有“真正的用户”可写-X            是否只有“真正的用户”可执行-O           是否只有“真正的用户”拥有该文件注:“真正的用户”是指登录时指定的UserID(实际ID),与当前进程用户ID(有效ID)相对;命令suid可以改变有效用户ID;二、文件粘贴位(sticky)有三个操作符来判断文件的粘贴位;操作符     描述-u             是否设置了setuid位-g             是否设置了setgid位-k             是否设置了sticky(粘贴)位三、文件类型判断操作符操作符       描述-f                是否是普通文件-d               是否是目录文件-l                是否是符号连接文件-T               是否是文本文件-B               是否是二进制文件-b               是否是块设备-c               是否是字符设备四、文件的存在性和长度测试操作符       描述-e               文件是否存在-s               文件是否非空-z               文件是否为空文件五、文件修改测试操作符       描述-A               距上次访问多长时间-C               距上次访问文件的inode多长时间-M              距上次修改多长时间六、UNIX/LINUX文件句柄类型测试操作符       描述-p               是否为管道-s               是否为Socket-t                是否表示终端 2. stat函数:返回文件属性信息。lstat返回符号连结本身的信息,如果不是符号链接则返回空列表。0 dev 设备号 驱动器号(C:通常是2,D:通常是3,等等)1 ino 索引节号 总是02 mode 文件的方式 就是-rwxr-xr-x前9个权限位。可以用8进制来进行逻辑运算。3 nlink 链接号 通常为0;Windows NT;文件系统允许链接4 uid 文件所有者的用户ID(UID)总是0 5 gid 文件所有者的组ID(GID)总是06 rdev 特殊文件信息 驱动器号(重复)7>8 atime 上次访问的时间 上次访问的时间9 mtime 上次修改的时间 上次修改的时间10 ctime Inode修改时间 文件的创建时间11 blksz 磁盘块的大小 总是012 blocks 文件中的块的数量 总是0例:获取文件时间my @array = stat(&quot;mysql.tar.gz&quot;);    print &quot;$array[9]\n&quot;;  use File::stat; $st = stat($file) or die &quot;No $file: $!&quot;; if ( ($st->mode & 0111) && $st->nlink > 1) ) {     print &quot;$file is executable with lots of links\n&quot;; }  if ( -x $st ) {     print &quot;$file is executable\n&quot;; } use Fcntl &quot;S_IRUSR&quot;; if ( $st->cando(S_IRUSR, 1) ) {     print &quot;My effective uid can read $file\n&quot;; } use File::stat qw(:FIELDS); stat($file) or die &quot;No $file: $!&quot;; if ( ($st_mode & 0111) && ($st_nlink > 1) ) {     print &quot;$file is executable with lotsa links\n&quot;; } 3.localtime格式化时间戳信息,例如从stat中得到的。my($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime $timestamp; 4. 逻辑运算符包括& | ^ > ~(按位取反)5.文件与目录操作在目录树中移动chdir &quot;/etc&quot; or dir &quot;cannot chdir to /etc:$!&quot;;使用类似SHELL下的通配符*: my @all_files = glob &quot;*&quot;或者my @all_files = glob &quot;*&quot;my @dir_files = #注意不带*的都会被perl认为是间接文件句柄读取,或者使用readline $dir_file[1];目录句柄my $dir_to_process = &quot;/etc&quot;;opendir DH, $dir_to_process or die &quot;Cannot open $dir_to_process: $!&quot;;foreach $file (readdir DH) {next unless $name =~ /\.pm$/;print &quot;one file in $dir_to_process is $file\n&quot;;}closedir DH;  unlink=rm rename=mv link=ln mkdir rmdir chmod chown需要的是一个数字ID号,需要用getpwnaw将字符串转换成iddefined(my $user = getpwnam &quot;merlyn&quot;) or die &quot;bad user&quot;;defined(my $group = getgrnam &quot;Users&quot;) or die &quot;bad group&quot;;chown $user, $group, glob &quot;/home/merlyn/*&quot;;修改时间戳来进行欺骗:my $now = time;my $ago = $now ? 24 * 60 * 60;utime $now, $ago, glob &quot;*&quot;; 6. 智能匹配操作符my $flag = 0foreach my $key ( keys %name ) {next unless $key =~ /Fred/;$flag = $key;last;}可以直接用智能匹配运算符来实现:cammand if %names ~~ /Fred/;数组的比较:print &quot;The arrays have the same elements!&quot; if @names1 ~~ @names2元素是否在数组中:print &quot;the $result is one of nums&quot; if @nums ~~ $result智能匹配对不同操作数的处理方式:%a ~~ %b哈希的键是否一致%a ~~ @b至少%a中的一个键在列表@b之中。%a ~~ /Fred/至少一个键匹配给定的模式%a ~~ 'Fred'哈希的$a{Fred}是否存在@a ~~ @b@a ~~ /Fred/@a ~~ 123@a ~~ 'Fred'$name ~~ undef$name ~~ /Fred/模式匹配123 ~~ '123.0'数字和字符串是否大小相等。'Fred' ~~ 'Fred'字符串是否完全相等123 ~~ 123数字大小完全相等 7. given语句同switch语句given ( $ARGV[0] ) {when( /fred/i ){}...default{}}given ( $ARGV[0] ) {when( $_ ~~ /fred/i){; continue;或者break;}...} 8. system函数system 'ls -l $HOME' “ls -l \$HOME”#注意,$HOME是SHELL变量,而不是perl內插变量如果执行的命令过长,那么perl就会在这个命令处暂停的时间很长。所以应该在末尾加上&号,让shell将它变成后台进程并立即退出。exec函数同shell中的exec函数,这时候原本perl程序的进程空间会被装入exec运行的程序。环境变量%ENV$ENV{‘IFS’};用反引号``捕获输出结果@who_lines=`who`;自动拆分成多行数据。defined(my $pid = fork) or die &quot;cannot fork:$!&quot;;unless ($pid) {#子进程操作exec &quot;date&quot;;}#父进程操作waitpid($pid, 0);用kill发送信号量 kill 2, 4201 or die &quot;Cannot signal 4201 with SIGINT: $!&quot;;用%SIG设置信号处理程序:sub my_int_handler{...}$SIG{'INT'}='my_int_handler';#哈希键是信号名,不用前缀SIG。值是中断处理程序名,不需要&号。 9. 将进程视为文件句柄Perl可以使用操作系统提供的管道通信机制,启动一个异步运行的子进并和它保持通信。直到子进程结束执行为止。open DATE &quot;date|&quot; or die &quot;cannot pipe from date: $!&quot;;open MAIL &quot;|mail merlyn&quot; or die &quot;cannot pipe to mail: $!&quot;;my $now = ;print MAIL &quot;The time is now $now&quot;;cloes MAIL; 即可, EOF会输出到写进程里。 10.用eval{}块捕获异常,避免整个程序都会异常退出。例如eval{$val = 5/0;}print &quot;An error occurred: $@&quot; if $@;文件打开过程中会有错误,可以在循环打开文件中使用eval。eval 函数的返回值都是小程序的最后一条语句的值,如果遇到 return 语句,与子例程相同。 11. 用grep来筛选列表my @odd_number;foreach (1..1000) {push @odd_numbers, $_ if $_ %2;}可以grep{$_ % 2} 1..1000;my @matching_lines = grep { /bfred\b/i } ; 12.用map对列表进行转换例如:@newdata = map { sprintf(&quot;%25s\n&quot;, &big_money($_) ) } @data; 13.切片在读取以:分割的字符串时,可以直接引入 例如 (split /:/)[4];(stat $some_file)[9];数组切片@names[2,5]等同于($names[2], $names[5]);哈希切片@names{@players}或者@names{'fred','cowerd'};这里还要使用@

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-560173-1-1.html 上篇帖子: [实战运维小技巧]-解决perl命令执行或编译问题 下篇帖子: Perl grep-Perl基地
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表