Perl小小notes

函数名 opendir
调用语法 opendir DIRHANDLE,EXPR
解说 打开目录EXPR,并将它与DIRHANDLE关联进行处理,使用readdir函数

返回 | 0失败,1成功 例子 |前端

函数名 readdir
调用语法 readdir DIRHANDLE
解说 从一个使用opendir打开的目录句柄读取目录记录也就是文件名

first line: #!\usr\bin\env perlpython

three values: scalar string array正则表达式

scalar variables:shell

$variable   #upper and lowcase letters are different
$fred=$fred+5     ==     $fred+=5

output with printexpress


###数组数组

  • 字符最后的空格能够被识别
  • 双引号必须加转义符,单引号不用加

列表是包含在括号里的一序列的值,能够为任何数值,也可为空,如:(1, 5.3 , "hello" , 2),空列表:()。 列表存贮于数组变量中,与简单变量不一样,数组变量以字符"@"打头,如: @array = (1, 2, 3);ruby

引用数组

$array[num] #因为数组元素是简单变量 数组变量和单变量能够用一个名字,在变量与序号【num】之间加".","{}"和“\”能够区分less

qw( fred barney betty wilma dino ) # same “×××××”, but less typing函数

####pop和push pop将数组最后一个元素取出测试

%fred=pop(@array);
     %fred=pop  @array;
     pop @array

push与pop相反

push(@array,1);
     push @array,@array1;
     push @array 1..10;

shift和unshift操做数组首元素


###输入 $name=<STDIN>;

在数组环境中,可把全部剩余的行做为一列表返回。如: @name=<STDIN>;

  • **chop()**函数,只是去除最后一个字符。

  • **chomp()**函数,就要首先判断最后一个字符是否是为"\n",它才去除。

Perl不会解析单引号中的内容,可是会解析双引号中的。

若是将变量放在单引号中,Perl仅仅会认为它是用户要显示字符(\’和\除外的转义字符也不会解析),可是若是将其放在双引号的字符串里,它将被解析为一个变量。并且Perl还会解析变量字符串里的特殊字符。

即便用单引号表示字符串时能够不用\做为转义字符

Perl还提供了两个函数因为引用字符串:q和qq。q函数的功能和单引号相似,qq函数的功能和双引号相似。这两个函数的主要目的是使用户在不用使用\’、\和\”等特殊字符的状况下,就能在字符串中使用单双引号。

反引号中的内容若是出现OS命令,该命令会被执行,而且结果数组会替换命令位置,或做为赋值的数据,缩写是qx/内容/

子程序定义和使用 1.先用后定义

&subname;
     sub subname{};

2.先定义能够直接调用

sub subname{};
     subname;

3.先定义程序名,再定义程序体

sub subname;
     subname;
     sub subname{};

4.do==& 子程序参数传递

&sub1(&number1, $number2, $nubmer3);
     ---
     sub sub1{
          my($number1, $number2, $number3) = @_;
          ---
     }

local函数在建立全局变量的一个局部实例后便可将它传递给任何子例程并继续进行局部初始赋值。运算符my以与local函数一样的方法建立一次局部实例,然而,由my建立的局部实例不能传递给其它子例程,传递给子例程进行运算的将是全局值而非局部引用值。


@_和$_的含义

"@_"是默认的数组变量 是子函数中的默认参数列表 在子函数中直接shift; 就能够从@_的前端弹出一个元素. 即 shift;==shift @_;

"$__"为默认列表变量 默认模式匹配空间 s/.../.../;==$_=~s/.../.../;

defined函数:用来判断一个标量或者其它量是不是undef的,也就是判断该变量是不是被赋过值的 @ARGV:用户从命令行获得的全部参数


###文件操做 open(filevar,filename); 例如 open(FILE,"zq"); open(FILE, "..\zq\qq1");

读,写(>),添加(>>); open的返回用来测试文件是否打开成功,非零即成功 读文件 $line=<MYFILE>;从文件中读取一行数据存储到简单变量$line中并把文件指针向后移动一行 @array = <MYFILE>;把文件的所有内容读入数组@array,文件的每一行(含回车符)为@array的一个元素。

写文件

open(OUTFILE,">filename");
 print OUTFIEL ("");

####错误处理 die函数 若是调用失败函数会将字符串打印到STDDERR上,并以$!的当前值退出脚本 while (~=~) 表达式自己返回一个布尔值,而且语句获得执行,赋值语句在任什么时候候都会获得执行!

split函数: 把字符串进行分割并把结果放入数组当中 @b=split(/:/,$a);

###harsh $harsh{$some_key};

数组能够储存数组元素, 数组能够储存哈希变量 仔细理解数组‘展开’的概念,与while循环有关 哈希的下标能够参与运算,与数组变量相似 使用 %hash 来表示哈希总体

%hash = (key1,value1,key2,value2);
     %hash = (key1=>value1,
                       key2=>value2);

reverse 函数将keyvalue对换 keys 函数提取索引 values 函数提取哈希值

@a = keys %hash;
     @b = values %hash;

each函数返回两个元素的序列

($key,$value)=%hash;
while( ($key,$value)=each %hash) {
       print “$key => $value\n”;
     }

exists 函数肯定哈希值是否存在,**delete **函数删除哈希值 插入函数没有意义 特殊哈希值 %ENV 系统的环境变量,如 $ENV{PATH};

chomp($line=<STDIN>);     read the next line and chomp it
define函数     判断是否为 undef
while(<STDIN>){...}
while (defined($_=<STDIN>)){...}
while(defined($line=<>)){ chomp($line); ...}
while(<>){chomp(...}
@ARGV     the list of the innovation argument,能够强行赋值
<>只能在程序中出现一次,也就是必须一次性从键盘输入完命令

print “ @ ”有空格,可是会有\n print @ 每空格,可是会有\n

格式化输出函数printf: printf函数使用 say函数:等同于shell里的echo,也等同于python里的print,也等同于ruby里的puts,在perl 5.10中方便? close filehandlie

<>能够读取命令行上的全部文件内容;若是没有给出文件名称,则能够读取标准输出。


##pattern expression

\b 单词的开头或结尾处,也就是单词的分界处。\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置

  • 一样是元字符,不过它表明的不是字符,也不是位置,而是数量——它指定前边的内容能够连续重复使用任意次以使整个表达式获得匹配。 . 连在一块儿就意味着任意数量的不包含换行的字符 代码 说明

. 匹配除换行符之外的任意字符

\w 匹配字母或数字或下划线或汉字

\s 匹配任意的空白符

\d 匹配数字

\b 匹配单词的开始或结束

^ 匹配字符串的开始

$ 匹配字符串的结束

好比一个网站若是要求你填写的QQ号必须为5位到12位数字时,可使用:^\d{5,12}$。

代码/语法 说明

  • 重复零次或更屡次
  • 重复一次或更屡次

? 重复零次或一次

{n} 重复n次

{n,} 重复n次或更屡次

{n,m} 重复n到m次

用小括号来指定子表达式(也叫作分组)

代码/语法 说明

\W 匹配任意不是字母,数字,下划线,汉字的字符

\S 匹配任意不是空白符的字符

\D 匹配任意非数字的字符

\B 匹配不是单词开头或结束的位置

[^x] 匹配除了x之外的任意字符

[^aeiou] 匹配除了aeiou这几个字母之外的任意字符

分类 代码/语法 说明

捕获 (exp) 匹配exp,并捕获文本到自动命名的组里

(?<name>exp)     匹配exp,并捕获文本到名称为name的组里,也能够写成(?'name'exp)

                  (?:exp)                匹配exp,不捕获匹配的文本,也不给此分组分配组号

零宽断言 (?=exp) 匹配exp前面的位置

(?<=exp)             匹配exp后面的位置

                  (?!exp)                 匹配后面跟的不是exp的位置

                  (?<!exp)               匹配前面不是exp的位置

注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

代码/语法 说明

*? 重复任意次,但尽量少重复

+? 重复1次或更屡次,但尽量少重复

?? 重复0次或1次,但尽量少重复

{n,m}? 重复n到m次,但尽量少重复

{n,}? 重复n次以上,但尽量少重复


##注意: ####好习惯: use strict; use warnings; my $a1;

在定义之中使用my确保用户定义的变量不与同名全局变量冲突,它使后面的变量成为一般语言所谓的local变量

$0 这个程式的执行名字

$n 这个程式的第n个参数值,n=1..9

$* 这个程式的全部参数,此选项参数可超过9个。

$# 这个程式的参数个数

$$ 这个程式的PID(脚本运行的当前进程ID号)

$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)

$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其余任何值代表有错误)

$- 显示shell使用的当前选项,与set命令功能相同

$@ 跟$*相似,可是能够看成数组用

判断文件状态 -op expr

-r(R)

readable

-w(W)

writable

-x(X)

execuable

-o(O)

owned

-e

exist

-z

null file

-s

~-z

-f

common file

-d

directory


错误: open使用错误 open(FILE,">../test_pl/test");

相关文章
相关标签/搜索