Perl入门教程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl入门教程相关的知识,希望对你有一定的参考价值。

2楼真是的,人家还没入门,你直接整个文件操作干嘛?
什么是Perl?

Perl 是一种最初开发用于文本操作的编程语言。现在它能应用于广泛的任务,包括系统管理、 web 开发、 网络编程、 GUI 开发和更多的普通用途。

这个语言以实用性为目标(易用、高效、完整)宁愿失去美丽(小巧、优雅、迷你)。它使用方便,且支持面向过程和面向对象编程,内置强大的文本处理支持,并有世界上最令人印象深刻的第三方模块的集中营。
运行Perl程序

在Unix命令行运行Perl程序:

perl progname.pl

另一种方法是,把这个放到你的脚本第一行:

#!/usr/bin/env perl

然后用/path/to/script.pl运行。当然,首先得让它能执行,你得chmod 755 script.pl(Unix下)。

(这里的第一行假设你有env程序。你也可以直接把你的perl解释器的路径直接放到第一行,比如#!/usr/bin/perl)
安全保障

默认情况下,Perl非常随意。为了使它更强健建议每个程序由下列行开始:

1. #!/usr/bin/perl
2. use strict;
3. use warnings;

附加的两行从perl中捕获您的代码中的各种常见的问题。它们检查不同的事情,所以你需要两个都加上。一个潜在的问题通过use strict;捕获,一旦它捕获到问题,会马上让你的程序停止运行。当然使用use warnings;时,仅仅出现警告(就好像命令行的-w选项)并不会停止程序。
基本语法概述

一个Perl脚本或程序包含一条或多条语句。这些语句只需直接写在脚本中,而不需要像main()这样的东西作为程序入口。

Perl语句以分别结束:

print "Hello, world";

以星号(#)开始的语句是注释:

# This is a comment(这是一条注释)

空白字符会被Perl忽略:

1. print
2. "Hello, world"
3. ;

……引号里的字符串除外:

1. # this would print with a linebreak in the middle
2. print "Hello
3. world";

字符串使用双引号或单引号:

1. print "Hello, world";
2. print 'Hello, world';

然而,只有双引号会“插入”变量值和像换行符(\n)这样的特殊字符(转义字符):

1. print "Hello, $name\n"; # works fine
2. print 'Hello, $name\n'; # prints $name\n literally

数字不需要引号:

print 42;

你可以使用或省略括号来传递函数的参数。它们只是在偶尔要改变或明确优先级的时候必须使用。

1. print("Hello, world\n");
2. print "Hello, world\n";

Perl变量类型

Perl有3种主要的变量类型:标量(scalars)、数组(arrays)和哈希(hashes)。

* 标量(Scalars)

一个标量表示只有一个值:

1. my $animal = "camel";
2. my $answer = 42;

标量的值可以是字符串、整数或浮点数,并且Perl会在需要的时候自动转换。你不需要预先声明你的变量类型,但是你需要在第一次使用它们的时候,使用my来声明它们。(这是use strict;所要求的)

标量可以用不用的方式使用:

1. print $animal;
2. print "The animal is $animal\n";
3. print "The square of $answer is ", $answer * $answer, "\n";

有大量的“魔法”标量的名称看上去像标点或线路噪音。这些特殊的变量用于各种目的。现在你只要知道其中一个,这就是“默认变量”$_。它被许多Perl的函数用作默认的参数,并且它被隐式设置到某些循环结构中。

print; # prints contents of $_ by default(默认打印$_的内容)

* 数组(Arrays)

数组用于表示一些值的列表:

1. my @animals = ("camel", "llama", "owl");
2. my @numbers = (23, 42, 69);
3. my @mixed = ("camel", 42, 1.23);

特殊变量$#array将返回数组最后一个元素的索引:

print $mixed[$#mixed]; # last element, prints 1.23

你可能想使用$#array + 1来得到这个数组的元素个数。别急,这很容易。在Perl预想找到一个标量值的时候(“在标量上下文”),使用@array会得到数组的元素个数:(译注:“上下文”是Perl很重要的特性之一,请查阅相关文档或在无忧Perl搜索相关内容)

if (@animals < 5) ... #译注:当@animals数组的元素个数少于5个的时候

当我们从数组获得元素值的时候,需要使用$,因为我们只要获取数组里的一个值;你请求一个标量,然后会获得一个标量。

从数组里获取多个值:

(译注:获取多个值,使用@,因为我们要获取数组里的几个值(列表)。)

1. @animals[0,1]; # gives ("camel", "llama");
2. @animals[0..2]; # gives ("camel", "llama", "owl");
3. @animals[1..$#animals]; # gives all except the first element

这叫“数组切片”。

你可以在列表里干些有意义的事情:

1. my @sorted = sort @animals;
2. my @backwards = reverse @numbers;

有两个特殊的数组,一个是命令行传到你脚本的参数@ARGV;另一个是传递给子程序的参数@_。
* 哈希

哈希用来表示键/值对:

1. my %fruit_color = ("apple", "red", "banana", "yellow");

你可以使用空白字符和=>操作符来美化上面的代码:

1. my %fruit_color = (
2. apple => "red",
3. banana => "yellow",
4. );

获取哈希元素:

1. $fruit_color"apple"; # gives "red"

你可以通过keys()和values()来获取键列表和值列表。

1. my @fruits = keys %fruit_colors;
2. my @colors = values %fruit_colors;

哈希没有特定的内部排序,然而你可以对键进行排序来遍历它。

和特殊的标量、数组一样,哈希也有特殊的。我们现在只要知道哈希%ENV包括所有环境变量



更复杂的数据类型可以使用引用来构造,允许你把列表和哈希放到另一个列表和哈希中。

引用是一个标量值,它可以引用任何其它的Perl数据类型。通过把引用存储为数组或哈希的元素值,你可以轻松创建列表/哈希中的列表/哈希。

以下示例演示了使用匿名哈希引用实现的两级哈希结构

1. my $variables =
2. scalar =>
3. description => "single item",
4. sigil => '$',
5. ,
6. array =>
7. description => "ordered list of items",
8. sigil => '@',
9. ,
10. hash =>
11. description => "key/value pairs",
12. sigil => '%',
13. ,
14. ;
15.
16. print "Scalars begin with a $variables->'scalar'->'sigil'\n";

变量作用域

上面所有的例子都使用这种语法:

1. my $var = "value";

实际上,my不是必须的。你可以省略:(译注:前提是,你没有使用“use strict;”语句)

1. $var = "value";

但是,上面的用法将创建一个全局变量,这是一个很差的编程实践。my创建一个词法作用域变量,这个变量只在定义它们的语句块中可见(比如一段包在大括号里的语句)。

1. my $x = "foo";
2. my $some_condition = 1;
3. if ($some_condition)
4. my $y = "bar";
5. print $x; # prints "foo"
6. print $y; # prints "bar"
7.
8. print $x; # prints "foo"
9. print $y; # prints nothing; $y has fallen out of scope

结合使用my和在Perl脚本开头使用use strict,解释器将捕获常见的编程错误。比如,在上面的例子中,最后的print $y将引发一个编译时错误并阻止程序运行。强烈建议使用use strict语句!
条件和循环语句

Perl有许多常用的条件和循环语句。Perl 5.10甚至提供了分支语句(拼作given/when)。

条件可以是任何Perl表达式。比较和布尔条件语句中常用的逻辑运算符,请参阅有关信息的下一节中的运算符的列表。

* if

1. if ( condition )
2. ...
3. elsif ( other condition )
4. ...
5. else
6. ...
7.

还有否定版本的:

1. unless ( condition )
2. ...
3.

这个否定版比if (!condition)更易读。

注意,大括号是必须的,即使代码块中只有一行。不过,这里有一个方法可以让你通过类似英语的语法来实现单行条件语句:

1. # the traditional way
2. if ($zippy)
3. print "Yow!";
4.
5.
6. # the Perlish post-condition way
7. print "Yow!" if $zippy;
8. print "We have no bananas" unless $bananas;

* while

1. while ( condition )
2. ...
3.

为了和unless同样的理由,也有一个否定版本:

1. until ( condition )
2. ...
3.

你也可以在后置条件里使用while:

print "LA LA LA\n" while 1; # loops forever

* for

跟C语言一样:

1. for ($i = 0; $i <= $max; $i++)
2. ...
3.

自然Perl提供了更友好的列表遍历循环foreach以后,C语言风格的for循环在Perl几乎不需要了。
* foreach

1. foreach (@array)
2. print "This element is $_\n";
3.
4.
5. print $list[$_] foreach 0 .. $max;
6.
7. # you don't have to use the default $_ either...
8. foreach my $key (keys %hash)
9. print "The value of $key is $hash$key\n";
10.

内置操作符和函数

Perl 附带了各种各样的内置函数。我们已经看到的几个,包括print,sort和reverse。

Perl常见操作符(运算符)

* 算术

1. + 加法
2. - 减法
3. * 乘法
4. / 除法

* 数字比较

1. == 等于
2. != 不等于
3. < 小于
4. > 大于
5. <= 小于等于
6. >= 大于等于

* 字符串比较

1. eq 等于
2. ne 不等于
3. lt 小于
4. gt 大于
5. le 小于等于
6. ge 大于等于

(为什么数字和字符串的比较运算符不同?因为我们没有不同的变量类型,并且Perl需要知道是以数字进行排序(99小于100)还是以字母进行排序(100在99前面))
* 逻辑

1. && and 和
2. || or 或
3. ! not 否

* 混合

1. = 赋值
2. . 字符串连接
3. x 字符串乘法
4. .. 范围 (建立一个列表)

一些操作符可以和=结合,像这样:

1. $a += 1; # same as $a = $a + 1
2. $a -= 1; # same as $a = $a - 1
3. $a .= "\n"; # same as $a = $a . "\n";

文件和I/O

你可以使用open()函数来打开一个文件,用于输入或输出:

1. open(my $in, "<", "input.txt") or die "Can't open input.txt: $!";
2. open(my $out, ">", "output.txt") or die "Can't open output.txt: $!";
3. open(my $log, ">>", "my.log") or die "Can't open my.log: $!";

你可以使用<>操作符从打开的文件句柄中读数据。在标量上下文中,它从文件句柄中读取一行;在列表上下文中,它读取整个文件,并将每一行作为列表的元素。

1. my $line = <$in>;
2. my @lines = <$in>;

一次性把整个文件读完,叫做“啜食(slurping)”。它能让人满意,但它可能是内存吞噬者。大多数文本文件处理可以通过Perl的循环结构,一行一行地完成。

<>操作符经常出现在while循环里:

1. while (<$in>) # assigns each line in turn to $_
2. print "Just read in this line: $_";
3.

我们已经看到了如何使用print()在标准输出里打印。但是,print()还能通过第一个可选参数指定一个文件句柄来打印(译注:将内容输出到指定的文件句柄中,即写入到文件句柄相关联的文件中)

1. print STDERR "This is your final warning.\n";
2. print $out $record;
3. print $log $logmessage;

当你完成了对文件句柄的操作之后,你应该使用close()来关闭文件句柄。(老实说,如果你忘记关闭了,Perl会帮你处理。)

close $in or die "$in: $!";

正则表达式

Perl对正则表达式的支持宽广而深入:

* 简单匹配

1. if (/foo/) ... # true if $_ contains "foo"
2. if ($a =~ /foo/) ... # true if $a contains "foo"

//匹配操作符(译注,完整的应该是:m//)默认操作$_,或者使用=~来绑定其它变量进行操作。
* 简单置换

1. s/foo/bar/; # replaces foo with bar in $_
2. $a =~ s/foo/bar/; # replaces foo with bar in $a
3. $a =~ s/foo/bar/g; # replaces ALL INSTANCES of foo with bar in $a

* 更复杂的正则表达式

你不仅能匹配固定的字符串。其实,你可以匹配任何你能想到的复杂正则表达式。

1. . 单个任意字符(默认不包含\n)
2. \s 一个空白字符 (空格, tab, 换行, ...)
3. \S 一个非空白字符
4. \d 一个数字 (0-9)
5. \D 一个非数字
6. \w 一个能组成单词的字符 (a-z, A-Z, 0-9, _)
7. \W 一个不能组成单词的字符
8. [aeiou] 匹配中括号内的任意一个字符
9. [^aeiou] 匹配除了中括号内列出的字符之外的任意一个字符
10. (foo|bar|baz) 匹配foo或bar或baz
11.
12. ^ 匹配开头
13. $ 匹配结尾

量词可用来指定数量:

1. * 零个或任意多个
2. + 至少一个
3. ? 零个或一个
4. 3 3个
5. 3,6 3到6个
6. 3, 至少3个

一些简单的例子:

1. /^\d+/ 以一个或多个数字开头
2. /^$/ 空的,没有任何东西
3. /(\d\s)3/ 3个带空白字符的数字
4. (比如 "3 4 5 ")
5. /(a.)+/ 匹配最少一次,含有a和任意字符
6. (比如 "abacadaf")
7.
8. # 从STDIN循环读入,并打印出非空白行:
9. while (<>)
10. next if /^$/;
11. print;
12.

* 圆括号捕捉

括号的另一个用法是分组。它可以用来捕捉最后使用的正则表达式匹配的结果。这些结果用$1、$2……表示。

1. # a cheap and nasty way to break an email address up into parts
2.
3. if ($email =~ /([^@]+)@(.+)/)
4. print "Username is $1\n";
5. print "Hostname is $2\n";
6.

子程序

写一个子程序是很容易的:

1. sub logger
2. my $logmessage = shift;
3. open my $logfile, ">>", "my.log" or die "Could not open my.log: $!";
4. print $logfile $logmessage;
5.

现在我们可以像使用其它内置函数一样,使用该子程序了:

1. logger("We have a logger subroutine!");

什么是shift?传递给子程序的参数保存在@_数组中。shift函数的默认参数是@_。所以my $logmessage = shift;去掉第一个参数,并将其赋值给$logmessage。

可以通过别的方法操作@_:

1. my ($logmessage, $priority) = @_; # common(通用)
2. my $logmessage = $_[0]; # uncommon, and ugly(不通过,并且很丑陋)

子程序可以返回值:

# sub square
# my $num = shift;
# my $result = $num * $num;
# return $result;
#

然后像这样使用它:

1. $sq = square(8);

Perl面向对象

Perl面向对象相对比较简单,这是实现使用引用什么样的对象知道自己是在Perl的概念为基础的封装。

刚开始进行Perl编程,你最常使用的Perl面向对象将是使用第三方模块,参见下文。
使用Perl模块

Perl 模块提供了一系列的功能,可帮助您避免重复劳动,它们可以通过CPAN(www.cpan.org)下载。许多流行的模块都已经包含在了Perl发行包中。

本文由无忧Perl(www.51perl.com)翻译,转载请注明本文链接:www.51perl.com/perl-brief-introduction/

水平有限,错误难免,欢迎指正,并以原文为准。原文地址:http://perldoc.perl.org/perlintro.html

希望对你有用

参考资料:http://www.51perl.com/perl-brief-introduction/

参考技术A 打开文件的常用方法是: open(FH, "< $filename") or die "Couldn't open $filename for reading: $!"; open() 函数通常带有两个参数,第一个为文件句柄,用于指向打开的文件, 第二个参数是文件名及模式(文件的打开模式)的混合体,如果文件被成功打开, open()函数返回true,否则为false。我们用“or”来测试该条件。 上述代码中的模式由小于字符(<)来表示。如果文件不存在,open()将返回false。 此时,你可以读文件句柄,但不可以写。 大于字符表示写。如果文件不存在,就会被创建。如果文件存在,文件被清除, 以前的数据将会丢失。你可以写入文件句柄,但不可以读入。 # 如果文件不存在,就创建它 open(FH, "> $filename") or die "Couldn't open $filename for writing: $!"; 如果文件不存在,添加模式(用两个大于符号表示)可以用来创建新文件,如果文 件存在,该模式并不会清除原来的数据。 同“<”或“读”模式一样,你只能对文件句柄进行写操作。 (所以的写入内 容都添加到文件尾)。企图进行读操作,会产生运行错误。 open(FH, ">> $filename") or die "Couldn't open $filename for appending: $!"; 通过“+<”模式,你可以既可以读文件,又可以写文件。你可以通过tell() 函数在文件内部移动,通过seek()函数进行定位。如果文件不存在,就会被创建。 如果文件已经存在,原来的数据不会被清除。 如果你打算清除原来的文件内容,或者自己调用truncate() 函数,或者使 用“+>”模式。 open(FH, "+> $filename") or die "Couldn't open $filename for reading and writing: $!"; 注意“+<”和“+>”的区别,两者都可以可读可写。前者为非破坏性写, 后者为破坏性写。 错误 错误是如何出现的?很多地方都会出现错误:如目录不存在,文件不可写入, 你的程序丢失了文件句柄等等。 你应该检查系统调用的结果 (如open() 和sysopen()),看看是否调用成功。 为了帮助用户查错,通常使用“or die()”,你应记住这些用法。首先, 应写出系统调用失败(“open”)的信息。其次,应写出文件名的信息,以便修正错 误时更容易地定位。第三,要写出打开文件的方式, (“for writing,”“for appending”)。 第四,输出操作系统的出错信息(包含在$!中)。这样,一旦出现文件不能打开的问题, 使用你的程序的用户会大体上知道为什么不能打开。有时,我们把第一个和第三个合并 在一起: or die "unable to append to $filename: $!"; 如果在open() 和出错信息中都写了文件的全名,你会冒改变了open() 的风险, 使得出错信息不合时宜或不正确。 # 下面会出现虚假的出错信息 open(FH, " or die "Can't open /var/log/file.pod for writing : $!";

你先学这个
参考技术B 你还没弄明白perl里面变量的特殊处, perl里面的变量分为标量和数组变量。 $fan = @output ; # $fan 建议你看看perl入门教程,会说的更明白些~~

Perl教程 - 文件操作

《Perl教程 - 文件操作
转自菜鸟教程:http://www.runoob.com/perl/perl-scalars.html
Perl 使用一种叫做文件句柄类型的变量来操作文件。
从文件读取或者写入数据需要使用文件句柄。
文件句柄(file handle)是一个I/O连接的名称。
Perl提供了三种文件句柄:STDIN,STDOUT,STDERR,分别代表标准输入、标准输出和标准出错输出。
Perl 中打开文件可以使用以下方式:
open FILEHANDLE, EXPR open FILEHANDLE sysopen FILEHANDLE, FILENAME, MODE, PERMS sysopen FILEHANDLE, FILENAME, MODE
参数说明:
  • FILEHANDLE:文件句柄,用于存放一个文件唯一标识符。
  • EXPR:文件名及文件访问类型组成的表达式。
  • MODE:文件访问类型。
  • PERMS:访问权限位(permission bits)。

Open 函数
以下代码我们使用 open 函数以只读的方式(<)打开文件 file.txt:
open(DATA, "<file.txt");
或者:
open DATA, "<file.txt";
<表示只读方式。
代码中的 DATA 为文件句柄用于读取文件,以下实例将打开文件并将文件内容输出:
实例
#!/usr/bin/perl
open(DATA"<file.txt") or die "file.txt 文件无法打开, $!"
while(<DATA>){
  print "$_";
}
以下代码以写入( > )的方式打开文件 file.txt:
open(DATA, ">file.txt") or die "file.txt 文件无法打开, $!";
>表示写入方式。
注:$!什么意思。
后者会显示:file.txt 文件无法打开,No such file or directory at xxx.pl line 3.
如果你需要以读写方式打开文件,可以在 > 或 < 字符前添加 + 号:
open(DATA, "+<file.txt"); or die "file.txt 文件无法打开, $!";
这种方式不会删除文件原来的内容,如果要删除,格式如下所示:
open DATA, "+>file.txt" or die "file.txt 文件无法打开, $!";或者:
open (DATA, "+>file.txt"or die "file.txt 文件无法打开, $!";
如果要向文件中追加数据,则在追加数据之前,只需要以追加方式打开文件即可:
open(DATA,">>file.txt") || die "file.txt 文件无法打开, $!";
>> 表示向现有文件的尾部追加数据,如果需要读取要追加的文件内容可以添加 + 号:
open(DATA,"+>>file.txt") || die "file.txt 文件无法打开, $!";
下表列出了不同的访问模式:
模式
描述
< 或 r
只读方式打开,将文件指针指向文件头。
> 或 w
写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
>> 或 a
写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
+< 或 r+
读写方式打开,将文件指针指向文件头。
+> 或 w+
读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
+>> 或 a+
读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。

Sysopen函数
sysopen 函数类似于 open 函数,只是它们的参数形式不一样。
以下实例是以读写(+<filename)的方式打开文件:
sysopen(DATA, "file.txt", O_RDWR);
如果需要在更新文件前清空文件,则写法如下:
sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );
你可以使用 O_CREAT 来创建一个新的文件, O_WRONLY 为只写模式, O_RDONLY 为只读模式。
The PERMS 参数为八进制属性值,表示文件创建后的权限,默认为 0x666
下表列出了可能的模式值:
模式
描述
O_RDWR
读写方式打开,将文件指针指向文件头。
O_RDONLY
只读方式打开,将文件指针指向文件头。
O_WRONLY
写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
O_CREAT
创建文件
O_APPEND
追加文件
O_TRUNC
将文件大小截为零
O_EXCL
如果使用O_CREAT时文件存在,就返回错误信息,它可以测试文件是否存在
O_NONBLOCK
非阻塞I/O使我们的操作要么成功,要么立即返回错误,不被阻塞。

Close 函数
在文件使用完后,要关闭文件,以刷新与文件句柄相关联的输入输出缓冲区,关闭文件的语法如下:
close FILEHANDLE close
FILEHANDLE 为指定的文件句柄,如果成功关闭则返回 true。
close(DATA) || die "无法关闭文件";

读写文件
向文件读写信息有以下几种不同的方式:
<FILEHANDL> 操作符
从打开的文件句柄读取信息的主要方法是 <FILEHANDLE> 操作符。在标量上下文中,它从文件句柄返回单一行。例如:
实例
#!/usr/bin/perl 
print "菜鸟教程网址?\n";
$name = <STDIN>;
print "网址:$name\n";
以上程序执行后,会显示以下信息,我们输入网址后 print 语句就会输出:

当我们使用 <FILEHANDLE> 操作符时,它会返回文件句柄中每一行的列表,例如我们可以导入所有的行到数组中。
实现创建 import.txt 文件,内容如下:
$ cat import.txt 
1
2
3
读取 import.txt 并将每一行放到 @lines 数组中:
实例
#!/usr/bin/perl 
open(DATA,"<import.txt") or die "无法打开数据";
@lines = <DATA>;
print @lines;    # 输出数组内容
close(DATA);
执行以上程序,输出结果为:
1
2
3

getc 函数
getc 函数从指定的 FILEHANDLE 返回单一的字符,如果没指定返回 STDIN:
getc FILEHANDLE getc
如果发生错误,或在文件句柄在文件末尾,则返回 undef。

read 函数
read 函数用于从缓冲区的文件句柄读取信息。
这个函数用于从文件读取二进制数据。
read FILEHANDLE, SCALAR, LENGTH, OFFSET read FILEHANDLE, SCALAR, LENGTH
参数说明:
  • FILEHANDLE:文件句柄,用于存放一个文件唯一标识符。
  • SCALAR:存贮结果,如果没有指定OFFSET,数据将放在SCALAR的开头。否则数据放在SCALAR中的OFFSET字节之后。
  • LENGTH:读取的内容长度。
  • OFFSET:偏移量。
如果读取成功返回读取的字节数,如果在文件结尾返回 0,如果发生错误返回 undef。

print 函数
对于所有从文件句柄中读取信息的函数,在后端主要的写入函数为 print:
print FILEHANDLE LISTprint LISTprint
利用文件句柄和 print 函数可以把程序运行的结果发给输出设备(STDOUT:标准输出),例如:
print "Hello World!\n";

文件拷贝
以下实例我们将打开一个已存在的文件 file1.txt ,并读取它的每一行写入到文件 file2.txt 中:
实例
#!/usr/bin/perl 
# 只读方式打开文件
open(DATA1"<file1.txt")

# 打开新文件并写入
open(DATA2">file2.txt")

# 拷贝数据
while(<DATA1>){
  print DATA2 $_;
}
close( DATA1 );
close( DATA2 );

文件重命名
以下实例,我们将已存在的文件 file1.txt 重命名为 file2.txt,指定的目录是在 /usr/runoob/test/ 下:
#!/usr/bin/perl

rename ("/usr/runoob/test/file1.txt", "/usr/runoob/test/file2.txt" );
函数 renames 只接受两个参数,只对已存在的文件进行重命名。

删除文件
以下实例我们演示了如何使用 unlink 函数来删除文件:
实例
#!/usr/bin/perl 
unlink ("/usr/runoob/test/file1.txt");

指定文件位置
你可以使用 tell 函数来获取文件的位置,并通过使用 seek 函数来指定文件内的的位置:
tell 函数
tell 函数用于获取文件位置:
tell FILEHANDLE tell
如果指定 FILEHANDLE 该函数返回文件指针的位置,以字节计。如果没有指定则返回默认选取的文件句柄。
seek 函数
seek()函数是通过文件句柄来移动文件读写指针的方式来读取或写入文件的,以字节为单位进行读取和写入:
seek FILEHANDLE, POSITION, WHENCE
参数说明:
  • FILEHANDLE:文件句柄,用于存放一个文件唯一标识符。
  • POSITION:表示文件句柄(读写位置指针)要移动的字节数。
  • WHENCE:表示文件句柄(读写位置指针)开始移动时的起始位置,可以取的值为0、1、2;分别表示文件开头、当前位置和文件尾。
以下实例为从文件开头读取 256 个字节:
seek DATA, 256, 0;

文件信息
Perl 的文件操作也可以先测试文件是否存在,是否可读写等。
我么可以先创建 file1.txt 文件,内如如下:
$ cat file1.txt 
www.runoob.com
实例
#/usr/bin/perl 

my $file = "/usr/test/runoob/file1.txt";
my (@description$size);if (-e $file){
   push @description'是一个二进制文件' if (-B _);
    push @description'是一个socket(套接字)' if (-S _);
    push @description'是一个文本文件' if (-T _);
    push @description'是一个特殊块文件' if (-b _);
    push @description'是一个特殊字符文件' if (-c _);
    push @description'是一个目录' if (-d _);
    push @description'文件存在' if (-x _);
    push @description(($size = -s _)) ? "$size 字节" : '';
    print "$file 信息:"join('',@description),"\n";}
执行以上程序,输出结果为:
file1.txt 信息:是一个文本文件, 15 字节
文件测试操作符如下表所示:
操作符
描述
-A
文件上一次被访问的时间(单位:天)
-B
是否为二进制文件
-C
文件的(inode)索引节点修改时间(单位:天)
-M
文件上一次被修改的时间(单位:天)
-O
文件被真实的UID所有
-R
文件或目录可以被真实的UID/GID读取
-S
为socket(套接字)
-T
是否为文本文件
-W
文件或目录可以被真实的UID/GID写入
-X
文件或目录可以被真实的UID/GID执行
-b
为block-special (特殊块)文件(如挂载磁盘)
-c
为character-special (特殊字符)文件(如I/O 设备)
-d
为目录
-e
文件或目录名存在
-f
为普通文件
-g
文件或目录具有setgid属性
-k
文件或目录设置了sticky位
-l
为符号链接
-o
文件被有效UID所有
-p
文件是命名管道(FIFO)
-r
文件可以被有效的UID/GID读取
-s
文件或目录存在且不为0(返回字节数)
-t
文件句柄为TTY(系统函数isatty()的返回结果;不能对文件名使用这个测试)
-u
文件或目录具有setuid属性
-w
文件可以被有效的UID/GID写入
-x
文件可以被有效的UID/GID执行
-z
文件存在,大小为0(目录恒为false),即是否为空文件,


相关推文






如果喜欢本公众号也请多多分享哟,谢谢您的关注

以上是关于Perl入门教程的主要内容,如果未能解决你的问题,请参考以下文章

Perl-Tk入门教程 - 创建一个窗口

Perl教程 - 变量

Perl教程 - 标量

Perl教程 - 文件操作

Perl语言入门

晴朗课堂:Perl语言入门到精通视频课