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天]
- Perl初级教程[第2天]
- Perl初级教程[第1天]
- Perl初级教程[第3天]
- Perl初级教程[第4天]
- Perl DBI 初级教程
- [转 - 改] Perl初级教程 (一)
- [转 - 改] Perl初级教程 (二)
- [转 - 改] Perl初级教程 (三)
- [转 - 改] Perl初级教程 (四)
- 精通Perl(第2版)
- shell初级教程-备忘录2
- linux 内核初级教程 -2
- 有关perl的一个比较好的初级教程
- 初级教程
- 第一天学PERL
- WordPress初级教程-2: 什么是Wordpress?
- 面向 Perl 开发人员的 XML,第 2 部分: 使用到 Perl 的高级 XML 解析技术
- Android[初级教程]第一篇 Button控件和TextView控件
- 开张大吉啦!!!
- [转]使用.net 程序生成 Excel 和Access 文件
- UNIX痛恨者手册[转载]
- RFC2460——Internet Protocol, Version 6 (IPv6) Specification [Internet 协议第六版 (IPv6) 规范]
- Perl初级教程[第1天]
- Perl初级教程[第2天]
- 2005精品书籍-go go go
- Perl初级教程[第3天]
- 关于VC的project-〉 setting-〉c/c++,Category:Precompiled Headers,选第二个和第四个的区别?
- 征程...
- 生成类库帮助的好工具AS2Doc
- Perl初级教程[第4天]
- SQL注入天书之ASP注入漏洞全接触
- 用 SQL Server CE 2.0 和 .NET Compact Framework 创建紧凑且可靠的移动应用程序