Perl初级教程[第2天]

来源:互联网 发布:电脑ip绑定域名 编辑:程序博客网 时间:2024/04/29 16:02
数组变量

数组变量是标量的集合。数组变量与标量有相同的形式,除了其前缀为@符号。下面的语句把三个元素赋给数组变量@food,把两个元素赋给数组变量@music。

数组通过以0开始的索引进行访问,方括号内为索引值。表达式

$food[2]

返回的结果为ells。注意上式中为$,而不是@,因为其引用的是一个标量。

数组赋值

在Perl中,相同的表达式在不同的上下文中会产生不同的结果。下面的第一个赋值语句引用了@music变量,所以结果与第二个赋值语句相同。

这也是把元素加入数组的一种方式。一种更简洁的把元素加入数组的方式是:

push(@food,"eggs");

- 把eggs推入数组@food的结尾。把两个或更多元素推入数组可以用下面方式中的一种:

push(@food, "eggs", "lard");push(@food, ("eggs", "lard"));push(@food, @morefood);

push函数返回新的列表的长度。

可以用pop函数移去一个列表中的最后一个元素,然后返回这个元素。在最初的列表中,pop函数返回eels,然后@food中有两个元素:

$grub = pop(@food); # Now $grub = "eels"

也可以把数组赋给一个标量。通常上下文是很重要的。$f=@food;得到@food的长度,但是$f="@food";把列表转换成以空格隔开每个元素的字符串。通过改变特殊变量$"的值可以把空格用其它任何字符串代替。这个变量只是Perl中很多特殊变量中的一个,它们中的很多都有奇怪的名字。

数组也可以用来为多个标量进行赋值:

($a, $b) = ($c, $d);  # Same as $a=$c; $b=$d;($a, $b) = @food;  # $a and $b are the first two    # items of @food.($a, @somefood) = @food; # $a is the first item of @food    # @somefood is a list of the    # others.(@somefood, $a) = @food; # @somefood is @food and    # $a is undefined.

最后一个赋值语句的发生是因为数组是贪婪的,@somefood会吞掉@food中的任何值。因此应尽量避免这种方式。

最后,你可能想知道列表中最后一个元素的索引值,可以用这个表达式:$#food。
打印数组:

既然上下文很重要,就不要奇怪下面的表达式产生不同的结果:

print @food; # By itselfprint "@food"; # Embedded in double quotesprint @food.""; # In a scalar context










文件处理

下面是一个简单的perl程序,与UNIX中cat命令对某个文件的操作相同。

#!/usr/local/bin/perl## Program to open the password file, read it in,# print it, and close it again.$file = '/etc/passwd';# Name the fileopen(INFO, $file);# Open the file@lines = <INFO>;# Read it into an arrayclose(INFO);# Close the fileprint @lines;# Print the array

open函数打开一个文件并进行读操作。第一个参数filehandle是指向文件的句柄。第二个参数为被打开的文件的文件名。如果文件名以被引号包围的形式给出,那么它只被从字面意义上引用,而没有shell解释。

因此表达式'~/notes/todolist'不会被成功地翻译。如果希望得到shell解释,可以使用尖括号:即使用<~/notes/todolist>。

close函数告诉Perl关闭被打开的文件。

open语句也可以对文件进行输出和附加操作。可以在文件名前加>进行输出操作,用>>进行附加操作:

open(INFO, $file);# Open for inputopen(INFO, ">$file");# Open for outputopen(INFO, ">>$file");# Open for appendingopen(INFO, "<$file");# Also open for input

如果想在一个已经打开的文件中打印信息,可以用带参数的打印语句。把一个字符串打印到一个用INFO句柄打开的文件中可以使用

print INFO "This line goes to the file./n";

可以用下面的语句打开标准输入(通常为键盘)和标准输出(通常为屏幕):

open(INFO, '-');# Open standard inputopen(INFO, '>-');# Open standard output

在上面的程序中从一个文件中读取信息。这个文件是INFO,Perl用尖括号对它进行读操作。因此语句

@lines=<INFO>;

把文件中的所有信息读入数组@lines中。如果用标量$lines,则只读第一行。在这两种情况下,每行都以换行符结束。


控制结构

Perl支持很多种与C类似的控制结构,但是也与Pascal很相似。下面我们分别对着这些结构进行讨论。

foreach

Perl使用foreach结构对数组或其它列表结构中的每行进行操作:

foreach $morsel (@food)# Visit each item in turn# and call it $morsel{print "$morsel/n";# Print the itemprint "Yum yum/n";# That was nice}

每次的操作过程被包围在花括号内。程序块中的$morsel第一次被赋予@food数组中的第一个值,然后被赋予数组的第二个值,依次类推。如果@food是空的,那么程序块将不会被执行。

判断

判断是检验表达式结果是真是假的一种结构。在Perl中,任何非0数字和非空字符串被看作真。数字0、0字符串和空字符串被看作假。下面是一些基于数字和字符串的判断:

$a == $b# Is $a numerically equal to $b?# Beware: Don't use the = operator.$a != $b# Is $a numerically unequal to $b?$a eq $b# Is $a string-equal to $b?$a ne $b# Is $a string-unequal to $b?

也可以用逻辑与、或、非:

($a && $b)# Is $a and $b true?($a || $b)# Is either $a or $b true?!($a)# is $a false?

for

Perl的for结构与C的类似:

for (initialise; test; inc){ first_action; second_action; etc}

语句initialise被首先执行,然后当test为真时程序块被执行。程序块每执行一次,inc发生一次。下面是一个循环打印数字0到9的循环:

for ($i = 0; $i < 10; ++$i)# Start with $i = 1# Do it while $i < 10# Increment $i before repeating{print "$i/n";}

while和until

下面是一个从键盘读输入,知道口令正确为止的程序:

#!/usr/local/bin/perlprint "Password? ";# Ask for input$a = <STDIN>;# Get inputchop $a;# Remove the newline at endwhile ($a ne "fred")# While input is wrong...{    print "sorry. Again? ";# Ask again    $a = <STDIN>;# Get input again    chop $a;# Chop off newline again}

当键盘输入与口令不同时花括号内的程序块被执行。while结构很清晰,但有几点要注意:第一,我们可以从标准输入读入信息,而不用打开文件。第二,当口令被输入时,$a被赋予包括换行符在结尾的值。chop函数删除字符串的最后一个字符,这里是换行符。

until也可以执行相同的工作。程序块被反复执行,直到表达式为真。

另一种方式是把while或until放在程序块的后面。这要求do放在程序块的开始处,而判断在结尾处。这样程序可以这样写:

#!/usr/local/bin/perldo{"Password? ";# Ask for input$a = <STDIN>;# Get inputchop $a;# Chop off newline}while ($a ne "fred")# Redo while wrong input

Perl初级教程[第1天]<< >>Perl初级教程[第3天]

原创粉丝点击