(一):字符串与排序
处理文本是perl最擅长的工作,而这个能力是由强大的正则表达式所提供的。通常的正则表达式在处理简单的文本问题时,显得过于复杂,所以下面就介绍几个能够简单实用的功能:
index查找子字符串的位置:
写法: index($string1,$string2,$number);
rindex($string1,$string2,$number);
对于第一函数,功能就是在字符串$string1中从左向右查找$string2出现的位置,返回位置数。第一个字符标为0,第二个为1,如果没办法找到返回-1。$number是制定从第几位开始查起!
第二个函数,则是查字符串$string1中最后一次出现$string2的位置。
substr找出制定位置的字符串:
用法: $part= substr( $string, $initial_position, $length);
在字符串$string中从$initial_postion位置起,找出长度为$length的子字符串,当设定长度大于剩余$string长度或不设定时,子字符串就直接取到末尾。注意位置用负数表示的含义,-1表示最后一位字符,越往前负越多!
some special examples:
#指定字符串替换:
substr($target_string,$initial_position,$length) = $substitute_string;
#指定字符串用正则表达式:
substr($target_string,$initial_position,$length) =~ s/$sting1/$sting2/g;
注意:这两个函数都不会区分字母的大小,也不必担心元字符,不会像正则一样设定内存变量。
(二):my, our, local 以及 typeglob
Perl中有两种名字空间(namespace):符号表(symbol table)和词法作用域(lexical scopes).在Perl中, 每个包(Package)有一个
符号表, 可以通过Packeagename::获取包中的变量.
比如:
package A;
$test = 1;
可以通过$A::test访问包A的变量test.
符号表是一个Hash表, 该Hash表的名字就是符号表所在包的名字.
比如你可以用下面的语句打印出在main包中的所有符号:
foreach (keys %main::)
{
print $_, "\n";
}
又比如, 如果在程序中声明了:
$test = 1;
可以通过$main::test来访问该变量(假设变量是在main包中).
在同一个符号表中, 可以存在同样名字的标量变量, 数组变量, Hash变量, 函数变量等.Perl中采用*符号来表示一个typeglobs,意思
就是"所有名字为XX的变量",比如:
$type = *test;
此时变量type中存放的就是当前包中所有名字为test的变量,
如果我们调用语句:
print $$type;
则将$type所指向的变量解释为标量, 类似的可以解释为数组, Hash, 函数等等.
但是, 如果你仅仅想让这个typeglobs作用于一个类型的变量, 也可以明确的指出来, 如:
*dick = \$richard;
这样dick变量就只能访问名为richard的标量了.
可以把typeglobs想象为另一个typeglobs的别名, 当写下代码
$type = *test;
的时候, type就是test这个typeglobs的别名了.
Perl中还支持符号引用, 它可以根据一个标量存放的字符串去查找名为该字符串的typeglobs,如:
$test = 1;
$name = "test";
print $$name;
Perl解释器首先去解释变量$name, 发现是一个字符串, 再根据该字符串去解释这个解引用, 也就是说:
$$name -> $test -> 1
在Perl中, 变量的名字是可以和Perl的关键字同名的, 只要在使用的时候有"足够的办法"让Perl解释器去明确辨别出来到底是哪种变量.
比如我写了一个名为for的函数, 一般而言, 在Perl中, 函数调用是可以省略掉前面的&符号的, 但是在这里对这个名为for的函数则不行,
Perl会把它解释为for循环.因此, 要明确的表示是在调用一个叫for的函数, 需要在前面加上&符号.对其它类型的变量, 这个例子同样适用.
在<<Perl语言编程>>(大骆驼)中, 将$&%@这几种分别作用在不同类型变量前面的特殊符号称之为"funny character".
在Perl中, 有三种修饰符是修饰变量的作用域的:our, my, local,它们与前面提到的Perl中的作用域息息相关.
our声明的变量是包全局的, 也就是说, our声明的变量会出现在这个包的符号表中;my声明的变量仅作用于一个块(block), 在Perl中,
一对{}包起来的部分称之为一个块, 比如一个函数是一个块, 一个循环是一个块,等等,my修饰的变量普遍作用于这些地方, 如果没有在哪一个
块中, 那么就仅作用于当前文件, 但是,无论如何, my修饰的变量都不会进入一个包的符号表中, 这也就意味着my声明的变量不能使用typeglobs
进行访问, 如:
my $test = 1;
$type = *test;
print $$type;
这段代码是没有任何效果的, 因为在当前包中找不到名字是test的变量.把上面代码中修饰变量test的my去掉, 再试试就知道区别了.
local是作用于那些在符号表中出现的变量的, 它让对这些变量的修改局限在一个块(block)中, 比如:
our $var;
$var = 1;
{
local $var;
$var = 2;
print $var, "\n";
}
print $var, "\n";
打印的结果是
2
1
local的出现让块中对变量var的修改仅仅局限在这个块中了.
总结:
1. Perl中有两个作用域:符号表和词法作用域, 每个包都有自己的符号表, 这样可以避免名字污染问题的出现, 类似于C++中的
namespace, 全局变量, 以及用our修饰的变量都属于这个作用域, 可以通过:包名称::变量名称来访问一个包中的全局变量.而词法作用域
是指的一个块, 或者一个文件, 凡是由my修饰的变量都是词法作用域中的变量, 它们不会出现在包中的符号表中, 在包之外不可见,
更甚者, 如果一个由my修饰的变量在一个块中, 它就仅仅在这个块中可见了.
2. 如果想让对某个全局变量的修改局部化, 那么就使用local修饰符, 在出了这个块之后, 自动恢复为全局变量原来的数据.
(三):perl在网页中抓取图片 binmode
今天在天涯上闲逛的时候,突然一个网页上面楼主贴了很多图片,都是满漂亮的,于是就想把这些图片都下载到本地的电脑上。以前用perl的LWP::Simple模块主要是提前里面的一些文本信息,基本上没碰到过什么障碍,不过这次下载图片可是第一次。利用以前下载文本信息的程序处理时,发现得到的图片内容都是二进制类型的,也就是这些get($url)出的结果是二进制的。后来在网上搜索到了一些解决方法,试了一下的确能够解决问题!
方法一:利用binmode函数将文件句柄转化下可以接受二进制的形式。
binmode 功能:
binmode FILEHANDLE
Arranges for FILEHANDLE to be read or written in "binary" or "text" mode on systems where the run-time libraries distinguish between binary and text files. If FILEHANDLE is an expression_r, the value is taken as the name of the filehandle. Returns true on success, otherwise it returns undef and sets $! (errno).
codes:
#!usr/bin/perl
use strict;
use LWP::Simple;
my $url="http::/../abc.jpg";
open FILE,">abc.jpg" or die "$!";
my $outcome=get ($url);
binmode(FILE);
print FILE $outcome; # input your want picture into the file named abc.jpg
方法二: 利用函数getstore()
getstore()功能:
见文档!
code:
#!usr/bin/perl
use strict;
use LWP::Simple;
my $url="http::/../abc.jpg";
getstore($url,"abc.jpg") or die "get picture failed!";
分享到:
相关推荐
个人的perl学习笔记,供大家分享,看看吧,正在学习当中目前
perl学习笔记,介绍perl的常用语法及例子
Perl学习笔记
perl 学习笔记 :perl入门知识点提炼,练习习题及答案。
Perl学习笔记,学习perl语言的好书
perl学习笔记,可对perl学习深入提供参考。 希望有所帮助。
Perl学习笔记中的所有脚本文件,https://blog.csdn.net/zgezi/category_10259467.html
perl学习笔记,让你快速掌握perl的基本概念 写一个完整的perl包,perl类和perlperl构造函数、析构函数
本书是perl的经典入门书籍,介绍了perl中最基本的概念和语法,是perl入门的好书,我向所有想了解或学习perl语言的朋友推荐本书。书中穿插有perl语法形成的历史和原因,使你能充分感受到perl语言的文化,这也是perl...
Perl确实是一种非常吸引人的程序语言,而之所以这么引人入胜的原因不单单在于他的功能,也在于他写作的方式,或说成为一种程序写作的艺术。即使你只是每天埋首于程序写作的程序设计师,也不再让生活过份单调,至少你...
perl学习笔记 介绍了perl学习的基础笔记,入门学习
主要介绍了Perl学习笔记之CPAN使用介绍,本文讲解了什么是CPAN、CPAN的目录作用介绍、CPAN安装Perl Module的两种方法等内容,需要的朋友可以参考下
perl学习笔记,简练易懂,是入门级的极佳教程,也可以当手册用。
主要介绍了Perl学习笔记之文件操作,本文分别给出了打开文件、读取文件、写入文件代码实例,需要的朋友可以参考下
perl 学习笔记,希望能对大家有帮助 perl 文档 速查手册
这是个人学习perl的笔记,非常的适合刚接触perl的人士!非常基础的知识!但愿能为您学习perl提供帮助!谢谢