八月 | ||||||
---|---|---|---|---|---|---|
日 | 一 | 二 | 三 | 四 | 五 | 六 |
28 | 29 | 30 | 31 | 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
初学Perl之五
今天要读取目录中的文件,把所有的txt文件打开用之前的程序分析一下。
先用的是foreach,后来改用while,运行报错,加打印信息看到readdir读进来的文件先是 . 和 .. 。不知道如何筛选目录下读出的文件,搜到一个perl学习笔记,那里找到了实例。
-
next unless $file =~ /\.TXT$/;
现在可以筛选出所有的txt文件了。
但是有个问题,程序如下:
readdir读出一个文件,打印出文件名,然后看是否是txt文件,是的话打印“one file in xxx ……”,然后打开这个文件,一行一行读取。现象是这样,读取某一个文件的时候,报出了open error: No such file or directory。
而这个文件是存在,并且之前打印文件名,打印“one file in xxx ……”都有。可是在打开文件时却出错,说文件不存在,为什么?
初学Perl之四
今天要把提取的字串输出到excel文件中。
一开始是直接写,用'\t'移到下一个单元格,但是不会换行。后来google上搜一搜知道要用Spreadsheet::WriteExcel模块。运行程序报错说“Can't locate Spreadsheet/WriteExcel.pm”,再搜了搜知道要打开PPM(Perl Package Manager)去安装这个模块。用它,写excel文件就方便了。我没有看文档,现在的需求还很简单。
然后碰到下一个问题,写中文乱码。之前搜索的时候看到过很多关于这个问题的帖子,这次是Unicode::Map模块。一样要去PPM安装。一样的方便。
程序如下:
-
#!/usr/bin/perl
-
use strict;
-
use warnings;
-
use Spreadsheet::WriteExcel;
-
use Unicode::Map();
-
-
my $workbook = Spreadsheet::WriteExcel->new("result.xls");
-
my $worksheet = $workbook->add_worksheet("hymz");
-
-
my $Map = new Unicode::Map("GB2312");
-
my $subset = "书名:</td>";
-
my $cnt = 0;
-
my $modflag = 0;
-
-
while(<>)
-
{
-
if($modflag == 1)
-
{
-
#get the book name.
-
$cnt = $cnt + 1;
-
$worksheet->write($cnt - 1, 0, $cnt);
-
$worksheet->write_unicode($cnt - 1, 1, $Map->to_unicode($1))
-
}
-
-
my $offset = 0;
-
if($offset == -1)
-
{
-
$modflag = 0;
-
}
-
else
-
{
-
$modflag = 1;
-
}
-
}
-
$workbook->close();
-
主要参考这篇文章:实例解说:用Perl来分析并生成中文Excel文件
初学Perl之三
今天程序终于跑对了。程序如下:
get the book name那里(L13, L14),这样写也可以:
这样写的时候,'/a'前面加'\'或者不加'\'结果都是对的;而采用第一种写法时不是这样,必须加'\',去掉则不正确,报错信息是:
Bareword found where operator expected at xxxx line 23, near "/>(.*?)</a"
(Missing operator before a?)
syntax error at xxxx line 23, near "/>(.*?)</a"
这是为什么?
初学Perl之二
程序有问题,有关字符串匹配。会用index函数去查找字串,那就能找到正确的行。可是运行总是报错,看不懂报错信息。怀疑是语法错误,却不知道错在哪儿。不像C,编译就排查了语法错误。CSDN上乱翻贴,看到有人推荐一个工具Komodo(下载)。装了后打开我的程序源文件,看到一行波浪线,太好了,这里有问题:
可是什么问题呢?书上说模式匹配函数(m//)是这样用的:
-
m/pattern/;
还说m后的第一个字符是模式分隔符。在一个例子里用!做分隔,我没有正确理解,这是把缺省分隔符(/)换成其他的(!)。因此这样才对:
现在的程序可以跑,但是结果不对。问题还是在这一行。我要取出所需要的字串。哪里不对?应该怎么写?没人可问,继续琢磨。
初学Perl之一
开始学习Perl,起由是想做个小工具,用C也可以,一则不急,二则不忙,那就慢慢做。
先下载ActivePerl,5.10.0 Build 1004。CSDN上看人介绍又下了个perl-lint-mode,也不知道怎么用,先放着。再下载EditPlus做编辑器。
我的第一个perl程序问题是:global symbol requires explicit package name at xxx。
google这个报错信息,知道了问题所在。程序里用了use strict之后,就必须用our或者my声明变量。为什么呢?找到了这个介绍:Use Strict And Warnings。
程序很简单,我只是想试一下命令行参数。