`
ShellyLi
  • 浏览: 114208 次
  • 性别: Icon_minigender_2
  • 来自: 山东
社区版块
存档分类
最新评论

Perl 学习笔记

    博客分类:
  • perl
阅读更多
(一):字符串与排序
处理文本是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学习笔记中提到的关键知识点的详细说明: 1. **标量**: 标量是Perl中最基本的变量类型,用于存储单个值,如字符串或数字。变量名前缀是美元符号“$”。例如,`$first_name = "Melanie"`定义了一个名...

    perl学习笔记参考

    ### Perl学习笔记参考 #### Perl简介 Perl是一种高级编程语言,全称为Practical Extraction and Report Language,由Larry Wall创建,并持续由他进行更新与维护。Perl最初被设计用于Unix环境下的编程任务,随着...

    Perl学习笔记

    ### Perl学习笔记关键知识点 #### 1. Perl简介 - **定义**:Perl是一种脚本语言,被设计用于处理文本文件、提取信息并生成报告。它由Larry Wall在1987年创建,目的是为了弥补当时其他语言如C、sed、awk等在处理文本...

    Perl学习笔记中的所有脚本文件

    Perl学习笔记中的所有脚本文件,https://blog.csdn.net/zgezi/category_10259467.html

    perl学习笔记,让你更容易入门

    ### Perl学习笔记:快速入门与面向对象编程 #### 基础概念介绍 Perl是一种功能强大的脚本语言,被广泛应用于系统管理、网络编程、文本处理等领域。它具有丰富的内置函数和灵活的数据类型,能够方便地处理各种复杂...

    perl学习笔记。。。

    本书是perl的经典入门书籍,介绍了perl中最基本的概念和语法,是perl入门的好书,我向所有想了解或学习perl语言的朋友推荐本书。书中穿插有perl语法形成的历史和原因,使你能充分感受到perl语言的文化,这也是perl...

    perl 学习笔记和心得

    Perl确实是一种非常吸引人的程序语言,而之所以这么引人入胜的原因不单单在于他的功能,也在于他写作的方式,或说成为一种程序写作的艺术。即使你只是每天埋首于程序写作的程序设计师,也不再让生活过份单调,至少你...

    Perl学习笔记.docx

    Perl是一种强大的脚本编程语言,尤其在文本处理和系统管理任务中广泛应用。...深入学习Perl,可以提升文本处理、系统管理以及自动化任务的效率。通过不断实践和探索,你可以掌握这个强大工具的所有潜力。

    Perl学习笔记之CPAN使用介绍

    总的来说,掌握CPAN的使用对于任何Perl开发者来说都是至关重要的,它提供了丰富的资源和工具,使得Perl语言的学习和应用变得更加便捷。无论是初学者还是经验丰富的程序员,都应该熟悉CPAN并学会利用它来提升自己的...

    perl学习资料!个人学习perl的笔记

    ### Perl语言学习笔记 #### Perl语言概述 - **高级语言与低级语言**: 在这篇笔记中,作者首先区分了高级语言和低级语言。高级语言指的是脚本语言,这类语言通常不直接操作底层硬件,例如Shell和Awk。低级语言则...

    perl 语言学习笔记

    ### Perl 语言学习笔记知识点概览 #### 第一章:Perl 语言简介及基础语法 - **Perl 的定义**:Perl 是 Practical Extraction and Report Language 的缩写,是一种强大的脚本语言,广泛应用于文本处理、系统管理...

    perl的学习笔记1

    这份"perl的学习笔记1"很可能是作者在深入学习Perl过程中积累的宝贵资料,包括他自己编写的小程序和学习心得。 首先,Perl语言的核心特性是其灵活性和适应性。它的语法混合了C、sed、awk等语言的特点,使得它既适合...

    Perl学习笔记之文件操作

    Perl是一种强大的脚本编程语言,尤其在处理文本和文件操作方面表现出色。在Perl中,对文件进行操作主要包括打开文件、读取文件和写入文件。...通过学习和实践这些基础操作,你可以在Perl中有效地管理和操作文件。

    Eclipse 3.3 中文PERL插件

    2. **perl学习笔记.doc**:个人学习Perl的心得笔记,可能涵盖了基本语法、常见问题和实用技巧。 3. **Shell_编程_教程.ppt**:虽然不是直接关于Perl,但Shell编程与Perl有密切关系,了解Shell可以帮助理解系统级操作...

Global site tag (gtag.js) - Google Analytics