Perl学习笔记(6)值为数组的数组,值为hash的hash,自定义的行分隔符

####################值为数组的数组
open(In, "sina.txt");
while(<In>)
{
chomp();
@URLS=/href=\"([^"]+)\"/g;
push(@ALLURLs, @URLS);
}
close(In);
foreach(@ALLURLs)
{
print "$_\n";
}


####################值为hash的hash
#词=>词与标注=>词与标注与属性值"1";
open(In,"tag.txt");
while(<In>){
chomp;
@Words=/(\S+)\/\S+/g;
@Pos=/\S+\/(\S+)/g;
for($i=0;$i<@Words;$i++){
${$HashDict{$Words[$i]}}{$Pos[$i]}=1;

}
close(In);


foreach(sort keys %HashDict){
print "\#$_\n";
$Pointer=$HashDict{$_};
foreach(sort keys %{$Pointer}){
print "Pos: $_\n";
}
}




####################Perl中的引用使用反斜杠表示
Perl引用就是指针,可以指向变量、数组、哈希表(也叫关联数组)甚至子程序。在Perl中,二者是通用的,无差别的。Perl引用在创建复杂数据方面十分有用。


例1
$variavle=22;  
$pointer=\$variable;  
$ice="jello";  
$iceprt=\$ice;  




例2
#!/usr/bin/Perl  
#UsingArrayreferences  
$pointer=\@ARGV;  
printf"\nPointerAddressofARGV=$pointer\n";  
$i=scalar(@$pointer);  
printf"\nNumberofarguments:$i\n";  
$i=0;  
foreach(@$pointer){  
printf"$i:$$pointer[$i++];\n";  





####################读取文件时的行分隔符号$/
Perl中有很多种特殊变量,就像awk一样,它们用于文本处理。像什么记录输入/输出分隔符之类的。在Perl中,$/意即输入记录分隔符,代表着一个记录的结束和开始。
通常我们使用钻石操作符<>来从文件句柄中读取所需要的数据,默认它每次只读取一行?那么它是如何区分新记录的呢?这就是的$/的作 用。当<>遇到$/所定义的分隔符时,就认为这是一个行的结束。而默认的$/值就是换行符(\n),当然不同系统之间默认的换行符不一样,这 点要注意下。
如果你要读取的数据像下面这样:
1
2
%%
3
%%
4
5
%%
6
你将如何按%%所示的分隔符来读取数据呢?我的意思是说,如何把1,2看成是一行,3是另一行,4 和5看成是一行。在我们了解到$/作用之后,你可能已经知道只要改变$/默认值为"%%\n"就行了。恩,就是这样。
但是,这样鲁莽的改变程序的默认的行为是非常的危险的。为了把这种危险缩小到最小范围,我们通常在一个代码中来重定义$/的值。这样它所给我们的影响只会在那个代码块中,像下面这样:
{
    $/="%%\n";
    ....
   $/="\n";
}
像你看到的那样,就算是在{}中,我们也保险的恢复了$/默认值,这是一个好习惯。难道不是吗?
如果你认为$/就是这样了,那么非常让你失望了。它还有比较有意思一个用法。让我们看一个需求:如何每次从文件中读取1024字节的数据呢?有过其它背景的程序员们,可能会使用一些文件函数来完成它。但是,我们在使用Perl。它有自己的套路。下面来看看:
{
    $/=\1024;
    while(<>) {...}
}
我从来不说什么废话,除了在这里之外。{}中的\1024看上去是一个对常量的引用。但把它赋值给$/之后,你就不能这么理解它了,我们得按照Perl套路来思考:它的意思就是每次只读取1024字节的数据。


####################localtime的使用
指令:localtime
语法:localtime(time)
说明:可返回九个有关时间的元素,在写CGI应用程序的时候常会用到系统的时间,所以在此会详细介绍这个函 数的用法。
示例: 
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); 
其中: 
$sec代表秒数[0,59] $min代表分数[0,59] $hour代表小时数[0,23] 
$mday代表是在这个月的第几天[1,31] 
$mon代表月数[0,11],要将$mon加1之后,才能符合实际情况。
$year从1990年算起的年数 $wday从星期六算起,
代表是在这周中的第几天[0-6] $yday从一月一日算起,代表是在这年中的第几天[0,365] 
$isdst只是一个flag 知道这些变量之后,就可以在CGI应用程序中拿来应用了。
此外,也可以用下面这一行指令在UNIX系统下取得系统的时间。
为了避免错误发生,最好用绝对路径的方法来取得系统时间,
如果绝对路径不清楚的话可以用"which data"这个指令来得知。
最后要提字符的话,就不能正确执行系统的程序了。 
$data='/usr/bin/data'; 而在perl5版本中,
也可以用下面这一行指令来取得系统时间。 $data=localtime(time);
阅读更多
文章标签: perl cgi unix
个人分类: Scripts
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭