perl 入门
来源:互联网 发布:淘宝商品视频拍摄技巧 编辑:程序博客网 时间:2024/05/15 12:53
1、安装
2、helloworld
如果您已加载了Perl,请确保已正确设置了路径以包含Perl的可执行文件。然后,打开文本编辑器并创建一个文本文件。在文件中,输入以下行: print "Hello World!n";将文件命名为“test1.pl”。在命令提示符下键入: perl test1.pl3、变量声明:
Perl语言中的变量非常有趣。Perl变量无需声明,用$来指明即可。例如:$s = "HellonWorldn"; $t = 'HellonWorldn'; print $s, "n", $t;或: $i = 5; $j = $i + 5; print $i, "t", $i + 1, "t", $j; # t = tab由于.表示字符串连接,因此可以估计 .= 与 C 语言中的“+=”具有相同的含义。所以,你可以写成:
$a = "Hello "; $b = "Worldn"; $a .= $b; print $a;
还可以创建数组:
@a = ('cat', 'dog', 'eel'); print @a, "n"; print $#a, "n"; # The value of the highest index, zero based print $a[0], "n"; print $a[0], $a[1], $a[2], "n";
符号$#表示获得数组中的最高索引,它等于数组中元素的编号减1。像在C语言中一样,所有数组的索引都是从零开始的。
您也可以创建散列:
%h = ('dog', 'bark', 'cat', 'meow', 'eel', 'zap'); print "The dog says ", $h{'dog'};
该散列中,单词'bark'和'dog'相关联,'meow'和'cat'相关联,等等。这个散列还可以表达的更具艺术性:
%h = ( dog => 'bark', cat => 'meow', eel => 'zap' );
运算符=>引用左边的字符串,相当于一个逗号。
erl内部并不存在整数,在perl内部总是按照双精度浮点数的要求来保存数字并进行运算的。如果要使perl支持unicode字符,需要添加 use utf8;\l 将下一个字母转换为小写\L 将它后面的所有字母都换为小写,直到\E为止\u 将下一个字母转换为大写\U 将它后面的所有字母都换为大写,直到\E为止\Q 相当于把它到\E之间的非单词字符加上反斜杠\E 结束\L、\U、\Q开始的作用范围per的告警信息:use warnings;或者使用 perl -w运行脚本或者加上 #!/usr/bin/perl -w如果看不懂告警,就是用use diagnostics;打印更详细的信息$#aaa表示aaa数组的最后一个元素的索引值关于perl中布尔值的判断1、如果是数字,0为假;所有其他的为真2、如果是字符串,空字符串为假,所有其他的字符串为真3、如果既不是数字也不是字符串,那就先换成数字或者字符串再进行判断。使用defined函数来判断变量是否定义数组定义:my @p1=('aaa','bbb','ccc');my @p2=(1..100);my @p3=qw(aaa bbb ccc);my @p4=qw! aaa bbb ccc !;$end=$#p1;$number=$#p1+1;$last=$p1[$#p1];$last=$p1[-1];pop取出数组中的最后的一个元素并将其作为返回值返回。$last=pop(@p1);push添加元素到数组的最后push(@p1,'jaj');push @p1,'aaaa';push @p1,@p2;shift取出数字第一个元素并将其作为返回值返回$first=shift(@p1);unshift添加元素到数组的最左边unshift(@p1,'jaj');unshift @p1,@p2;splice可以实现从中间操作数组;foreach 来循环遍历数组中的值reverse反转数组sort 对数组进行排序sort(@p1) 正向排序reverse sort(@p1) 逆向排序chomp(@p1);chomp(@line =<STDIN>);可以使用state操作符来声明持久性私有变量state $sum=0;state @numbers;打印数组:print @arrayprint "@array"@ARGV是存放所有参数的数组<>砖石操作符,把输入参数当作文件处理文件操作符(文件句柄)open CONFIG, 'test';open CONFIG, '<test';open CONFIG, '>test';open CONFIG, '>>test';关闭文件句柄:close CONFIG;读取或者写入的时候指定文件的字符编码open CONFIG, '<:encoding(UTF-8)', 'test';open CONFIG, '>>:encoding(UTF-8)', 'test';打印perl能处理的字符编码清单perl -MEncode -le "print for Encode->encodings(':all')"判断文件句柄是否成功的代码:my $success=open CONFIG, '>>', test';if( !$success ){ print "create file faild";}if( ! open CONFIG, '>>', 'test' ){ die "Can't create config file: $!";}if( @ARGV<2 ){ die "Not enough arguments\n";}自动检查致命错误use autodie;可以将文件句柄设置成变量,这样文件句柄可以作为子程序的参数传递,或者放在数组和hash中排序,或者严格控制其作用域。打印往文件句柄中写入数据的时候不需要加入逗号!hash申明hashmy %test=('foo'=>35,'bar'=>39,'carl'=>34,'zhang'=>89);my %test=('foo',35,'bar',39,'carl',34,'zhang',89);访问哈希元素$hash{$key};哈希元素赋值$hash{'test'}='carlzhang';访问整个hashmy @any_array=%array;print "@any_array\n";hash转换my %test_hash=reverse %hash;hash函数keys函数能返回hash的所有键列表values函数能返回hash所有的值列表my %test=('foo'=>35,'bar'=>39,'carl'=>34,'zhang'=>89);my @test_key=keys%test;my @test_value=values%test;print "test_key is: @test_key\n";print "test_value is: @test_value\n";使用each函数遍历hashmy %test=('foo'=>35,'bar'=>39,'carl'=>34,'zhang'=>89);while( my($test_key,$test_value)=each %test){ print "$test_key=>$test_value\n";}my %test=('foo'=>35,'bar'=>39,'carl'=>34,'zhang'=>89);foreach my $test_key (sort keys %test){ my $test_value=$test{$test_key}; print "$test_key=>$test_value\n";}判断键值是否存在:if ( exists $test{'foo'}){ print "key fool is in test hash\n";}删除hash中的某个元素delete $test{'foo'};%ENV环境变量my @test=%ENV;foreach $test_key (keys %ENV){ print "$test_key=>$ENV{$test_key}\n";}模式匹配:m/string/;m%string%;/string/;使用/i忽略带小写/string/i用/s匹配任意字符/test.*aaa/s 会匹配test和aaa之间的所有内容,包括换行符用/x加入空白符,有了/x,perl会忽略空格和正则表达式中的perl风格的注释。\A表示字符串开头\z表示要匹配的字符串绝对末尾\b匹配单词边界\B不匹配单词边界捕获使用?:来指定不捕获小括号内的东东使用?<LABEL>来命名捕获的内容,使用$+{LABEL}来提取捕获的内容贪婪匹配*? +? {1,}? {4,20}? ??$^I 读取文件后对文件进行备份perl模块perldoc CGI 查看模块的用法cpan -a 列出安装的模块模块的安装:perl Makefile.PLmakemake install可以在perl Makefile.PL后面通过INSTALL_BASE指定安装的路径File::Basename和File::Spec的使用use File::Basename;use File::Spec;my $name="/usr/local/bin/perl";my $filename=basename $name;my $dirname=dirname $name;my $new_name=File::Spec->catfile($dirname,$filename);print "filename is $filename\n";print "dirname is $dirname\n";print "newname is $new_name\n";文件操作文件测试操作符-r 文件或者目录对当前用户或组来说是可读的-w 文件或者目录对当前用户或组来说是可写的-x 文件或者目录对当前用户或组来说是可执行的-o 文件或目录由当前用户拥有-R 文件或者目录对实际的用户或者组是可读的-W 文件或者目录对实际的用户或者组是可写的-X 文件或者目录对实际的用户或者组是可执行的-O 文件或者目录由实际的用户拥有-e 文件或者目录是存在的-z 文件存在且没有内容(对目录来说永远为假)-s 文件或者目录存在而且有内容(返回值是以字节为单位的文件大小)-f 是普通文件-d 是目录-l 是符号链接-S 是socket类型的文件-p 是命名管道,也就是先入先出(fifo)队列-b 是块设备文件(比如某个可挂载的磁盘)-c 是字符设备文件(比如某个I/O设备)-u 文件或者目录设置了setuid位-g 文件或者目录设置了setgid位-k 文件或者目录设置了sticky位-t 文件句柄是TTY设备-T 看起来像文本文件-B 看起来像二进制文件-M 最后一次被修改后至今的天数-A 最后一次被访问后至今的天数-C 最后一次文件节点编号(inode)被变更后至今的天数测试统一文件的多项属性if (-r $file and -w $file){.....}可以改写成如下语句,以提高性能if (-r $file and -w _){.....}_符号表示虚拟文件句柄,它会告诉perl用上次查询过的文件来做当前测试。stat和lstat函数stat函数返回一个有13个元素组成的列表。dev 0 文件所在的设备编号ino 1 文件的inode标号mode 2 文件模式(权限、类型)nlink 3 文件或者目录的连接数uid 4 文件的用户IDgid 5 文件的组IDrdev 6 设备识别码(只用于特殊文件)size 7 文件总的自己数atime 8 文件最后访问时间mtime 9 文件最后更改时间ctime 10 inode更改的时间blksize 11 文件系统I/O首选块的大小blocks 12 实际分配的文件块数localtime函数($sec,$min,$hour,$mday,$mon,$year_off,$wday,$yday,$isdat) = localtime;$sec 秒,0 ~ 59$min 分,0 ~ 59$hour 时,0 ~ 23$mday 月份中的日期, 1 ~ 2 8、2 9、3 0或3 1$mon 年份中的月份, 0 ~ 11(这里请特别要小心)$year_off 1900年以来的年份。将1900加上这个数字,得出正确的4位数年份$wday 星期几,0 ~ 6$yday 一年中的第几天,0 ~ 364或365$isdst 如果夏令时有效,则为真perl目录操作chdir改变工作目录chdir '/etc' or die "can't chdir to /etc: $!\n";在程序内部使用通配符匹配文件my @files=glob '.* *'; #匹配多个模式需要用空格隔开,也可以采用my @files=<*>;的方式print "@files\n";opendir 打开目录readdir 读取目录下的文件名closedir 关闭打卡的目录句柄测试代码:use File::Spec::Functions;my $dir='/etc';opendir DIR,$dir or die "can't open /etc directory: $!\n";foreach my $file (readdir DIR){ if ($file=~/^\./){ next; } $file=catfile($dir,$file); print "we found $file in /etc directory\n";}closedir DIR;unlink删除文件,返回成功删除文件的数目,unlink不能用来删除目录rename重命名文件测试代码:for my $file (glob '*.old'){ my $new_file=$file; $new_file=~s/old/new/; if (-z $new_file){ print "$new_file is exists ,please check it out\n"; }else{ rename $file,$new_file or warn "rename $file faild,please check it out\n"; print "rename $file success ,don't worry\n"; }}创建和删除目录mkdir 创建目录my $dir='aaa';my $permissions="0755";mkdir 'aaa',oct($permissions) or die "can't create directory aaa: $!\n";rmdir删除目录,每次只能删除一个目录,而且删除时目录必须为空,不然会导致失败!chmod修改文件或者目录权限chmod 0755,'test';chown修改文件或者目录的属主或者属组,返回受影响的文件数量测试代码:my $user=52;my $group=52;chown $user,$group,'bbb';defined(my $user1=getpwnam 'puppet') or die "bad user: $!\n";defined(my $group1=getpwnam 'puppet') or die 'bad group: $!\n';chown $user1,$group1,'bbb.new';utime修改文件的时间戳(最近的更改和访问时间)测试代码:my $now=time;my $ago=$now-24*60*60;utime $now,$ago,'bbb';字符串和排序用index查找子字符串my $string='hah aaa bbbcc aa ddd';my $part=index($string,'aa');print "$part\n";排序按照数字排序<=>;按照字符排序cmp;my @some_numbers=qw{1 10 23 100 34 45};my @some_chars=qw{aa cc bb dd dc bc};sub by_number{ $a<=>$b;}sub by_char{ $a cmp $b;}my @test=sort by_number @some_numbers;my @test2=sort by_char @some_chars;print "@test\n";print "@test2\n";sub sort_test{ substr($test1{$a},2,6) <=> substr($test1{$b},2,6) or substr($test1{$a},0,1) cmp substr($test1{$b},0,1)}执行外部命令IPC::System::Simplesystem systemxcapture capturex错误扑捉:evalmy $aaa1=$ARGV[0];my $aaa2=$ARGV[1];my $test=eval{$aaa1/$aaa2} || 'aaa';print "I couldn't divide by \$aaa2: $@" if $@;print "$test";有4中类型的错误eval捕捉不到:1、代码语法错误2、perl解析器本省的崩溃错误3、告警类错误4、每次调用exit的时候
0 0
- Perl入门
- Perl 入门
- perl入门
- perl入门
- perl 入门
- Perl 入门
- perl入门
- Perl DBI 入门
- perl语言入门笔记
- perl模块使用入门
- perl语言入门
- Perl 快速入门
- PERL入门之一
- perl 入门资料集
- 《Perl语言入门》 读书笔记
- perl语言入门笔记
- Perl入门(数组)
- Perl快速入门
- 错误解决:Some projects cannot be imported because they already exist in the workspace
- linux C 中的volatile使用
- [Python源码学习]之内存管理
- 修改浏览器的 User-Agent 来伪装你的浏览器和操作系统
- opengl编程指南笔记(四)第三章 视图
- perl 入门
- SQL SERVER自动发邮件
- Non-blocking BSD socket connections
- error opening trace file: No such file or directory
- jq获取值
- sql中 in 、not in 、exists、not exists 用法和差别
- C++ new和delete
- CocoaPods一个Objective-C第三方库的管理利器
- 根文件系统制作(mini6410)