1. 苏葳的备忘录首页
  2. 编程

Perl一些笔记

perl悲剧的IT民工,什么都要学一点。Perl既然被称为脚本语言,就应该象vbscript或java script那样语法简单明快些,可perl完全不是这回事,据说perl的设计宗旨就是尽可能随意自然,难道要随意成自然语言?当然说也没用。

一、<>运算符,多用于文件操作。

$kkk=<STDIN>;
chomp $kkk;
print($kkk);

第一句<STDIN>指从标准输入中获得输入。

第二句chomp为去除串尾多余字符,因收到的输入是带回车换行符的。

第三句,打印出输入内容。

在Perl中,print “ffffff”;和print(“ffffff”);均为可接受形式。类似于哪种语言?好象是vb吧。

二、if 语句

$expr=<STDIN>;
chomp $expr;
if ($expr>5)
{
  print ">5";
}elsif($expr==5)
{
print "=5";
}
else
 {print "<5";}

注意其中的elsif,windows或unix shell脚本跟它挺象。

三、循环语句:

for ,while 循环与C等类似。

对应于break和continue语句,有last和next对应。

$kkk=<STDIN>;
chomp $kkk;
$i=1;
while($i<$kkk)
{
  print $i;
  last if ($i>5);
  $i++;
}

若输入10时,程序将在打印6之后退出。

$kkk=<STDIN>;
chomp $kkk;
$i=1;
while($i<$kkk)
{
  print $i;
  next if($i==3);
  last if ($i>5);
  $i++;
}

中间加入next if($i==3);后是什么情况?悲剧的陷入了死循环。因为值为3时$i++被跳过,所以会重复打印3。

四、文件操作

open(MYTXT,"nnn.txt")||die;

此程序执行时,若nnn.txt不存在,则会在屏幕打印Died at open line 1.并结束。

若在die后加上 “ffffffffffffffffff”,则会打印 fffffffffffffff at open line 1.

有一特殊变量$!,将返回程序最后一个错误,因此可用die $!;来输出错误信息,是不是跟shell的系统变量很象?

$line=<MYTXT>;

此时$line即为文件的一行,若文件至结尾,则返回为空。

while (defined($a=<MYTXT>)) {
  print $a;
}

打印文件每行。

open my $aaa ">tttt.txt";
print $aaa "gggggggggggg";
close my $aaa

将向文件tttt.txt中写入一行gggggggggggg

注意,$aaa与”ggggggggggggg”切不可有逗号,否则print无法识别$aaa为文件描述符。

五哈希表,其实也就是键值对,与python中的dict类型变量相似。

在perl中hash表是一种特殊的数组。

%aa=(aaa=>"111",bbbb=>"222");#很有特色的哈希表初始化形式。若直接打印%aa,则为aaa111bbbb222等等。
$aa{ccc}='333333333';
print $aa{ccc};

其实ccc加不加引号都不影响结果,perl会自动转换。

六 模块

use Cwd;

这是引入一个目录操作模块的用法,当然use strict;是use的一种不同用法,可见use 后并非一定跟有模块名。

执行后,将会把Cwd模块中一些函数导入空间中。可在系统命令下用perldoc Cwd查看相关帮助说明。

如:

use Cwd;
print "-----------------";
print getcwd;
print "\n";

即是使用Cwd中的getcwd函数。获取当前所在目录。

七 系统变量

@INC 是系统默认查找模块的路径

print @INC可在程序中打印出来。

foreach (@INC){
  print $_;
  print "\n";
}

$_是个特殊的变量,用于依次取得集合中的值。

perl -v显示perl的版本说明。

perl-V则会显示当前安装的perl的详细信息。也包含有@INC的值。

八 正则表达式

正则表达式显然是perl的核心,如下一个正则的例子:

while ( <$in> )
{
  s/^PROJECTDIR=(.*)$/PROJECTDIR=$pwd/g;
  s/^PREFIX=(.*)$/PREFIX=$prefix/g;
  print $out $_;
}

<$in>显然是从文件中读取一行。

而while体内,并无行变量,那么$_通常在没有明确声明变量时出现。

用过vi的,会理解s/^PROJECTDIR=(.*)$/PROJECTDIR=$pwd/g;这句的用法,即在本行($_)中搜索^PROJECTDIR=(.*)$,即所有PROJECTDIR起头的行,然后替换为PROJECTDIR=$PWD。若在vi中使用,与此处用法完全一样,但若要全文内替换,则前面加上%即可。

print $out $_;即是将替换后的本行写入输出文件。

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/336.html

发表评论

邮箱地址不会被公开。 必填项已用*标注