Perl语言文件读取与输出

Perl语言文件读取与输出,第1张

你截图显示你代码的文件格式是utf8

但是你电脑目录极有可能是gb2312的编码,你的路径中出现了中文“王大拿”,编码不匹配导致找不到文件,解决的方法如下任选一:

1、将中文路径改为英文路径;

或者

2、将在编辑器上方将代码文本的格式选为gb2312;

3、或者使用perl的Encode模块将路径由utf8转为gb2312

1、基本格式:perl -参数 ‘命令' 输入文件

2、 perl -e 为必须要写的参数

3、 perl -pe 可用于读取文件每行,并按照给定的命令进行处理,最后输出;如将文件1txt中的aaa替换为AAA: perl -pe 's/aaa/AAA/g' 1txt

4、 perl -l 参数几乎可以跟n搭配代替perl经常用的 while(<>){chomp;} 语法

5、如果需要处理tab/空分割的文件的每一行内容,那么 perl -alne 参数几乎可以说是必备的,例如 while(<>){chomp;@F=split /\s+/,$_;print "$F[0]\n"} 相当于: perl -alne 'print $F[0]'

6、perl单行命令脚本里的变量都不需要预先声明,如想打印出每空行,并且每行以行数开头: perl -``ne 'print ++$a" $_" if //'

7、perl单行命令有时优于sed/grep等shell命令是由于其优秀的正则匹配,通常简单的匹配可以如:匹配上的行号,模仿grep -c的功能: perl -lne '$a++ if /regex/; END {print $a+0}'

8、perl单行命令可以使用perl的模块,如使用sum函数的模块: perl -MList::Util=``sum -alne 'print sum @F'

9、perl也可以像awk一样使用END命令,如打印出文件中总单词个数

perl -alne '$t += @F; END { print $t}'

10、perl也可以使用 map{} 等函数,如打印出匹配上的单词的总个数: perl -alne 'map { /regex/ && $t++ } @F; END { print $t }'

11、perl单行命令可以说是将perl的简洁用到了极致,如打印出匹配上的行: perl -``ne '/regex/ && print'

12、perl单行命令能像perl一样灵活的使用则正表达式: perl -``ne 'print if /^\d+$/'

使用perl来处理数据的我们,会一点Perl one line可以有效的减少编写重复命令的时间,尤其是那些就用1-2次就不会用的脚本,尤其在window系统下不方便使用shell命令的时候。

PS 当然在windows系统下也可以借用git模拟Unix命令环境~~~~

>

标量是一个简单的数据单元。标量可以是一个整数,浮点数,字符,字符串,段落或者一个完整的网页。

1 数字标量

2 字符串标量

注意单引号和双引号的区别

3 标量运算

4 多行字符串

5 特殊字符

如: __FILE__ , __LINE__ , 和 __PACKAGE__ 分别表示当前执行脚本的文件名,行号,包名。

这些特殊字符是单独的标记,不能写在字符串中,例如:

6 v字符串

一个以v开头,后面跟着一个或多个用句点分隔的整数,会被当作一个字串文本。

当你想为每个字符 直接声明其数字值时,v-字串提供了一种更清晰的构造这类字串的方法,而不像 "\x{1}\x{14}\x{12c}\x{fa0}" 这种不易于理解

Perl数组是一个存储标量值的列表变量,变量可以是不同类型。

数组变量以 @ 开头。访问数组元素使用 $ + 变量名称 + [索引值] 格式来读取

1 创建数组

数组变量以 @ 符号开始,元素放在括号内,也可以以 qw 开始定义数组

@array = (1, 2, 'Hello');

@array = qw/ 这是 一个 数组/;

第二个数组使用 qw// 运算符,它返回字符串列表,数组元素以空格分隔。当然也可以使用多行来定义数组:

@days = qw/google

taobao

runoob/;

也可以按索引来给数组赋值,如下所示:

$array[0] = 'Monday';

$array[6] = 'Sunday';

2 访问数组元素

访问数组元素使用 $ + 变量名称 + [索引值] 格式来读取,实例如下:

数组索引值从 0 开始,即 0 为第一个元素,1 为第二个元素,以此类推。

负数从反向开始读取,-1 为第一个元素, -2 为第二个元素

3 数组序列号

Perl提供了可以按序列输出的数组形式,格式为 起始值 + + 结束值

4 数组大小

数组大小由数组中的标量上下文决定的,数组长度返回的是数组物理大小,而不是元素的个数

5 添加和删除数组元素

Perl提供了一些有用的函数来添加和删除数组元素: push, pop, shift, unshift

实例:

6 切割数组

数组索引需要指定有效的索引值,可以是正数后负数,每个索引值使用逗号隔开。

如果是连续的索引,可以使用 来表示指定范围:

7 替换数组元素

Perl中数组元素替换使用splice()函数,语法格式如下:

splice(@array, offset, length, list)

参数说明:

@array:要替换的数组

offset:起始位置

length:替换的元素个数

list:替换元素列表

实例:

8 将字符串转换为数组

Perl中将字符串转换为数组使用split()函数, 语法格式如下:

split(pattern, expr, limit);

pattern:分隔符,默认为空格。

expr:指定字符串数。

limit:如果指定该参数,则返回该数组的元素个数。

9 将数组转化为字符串

Perl中将数组转换为字符串使用join()函数,语法格式如下:

join(expr, list);

参数说明:

EXPR:连接符。

LIST:列表或数组。

10 数组排序

Perl中数组排序使用sort()函数,语法格式如下:

sort(subrountine, list);

参数说明:

SUBROUTINE:指定规则。

LIST:列表或数组。

实例:

注意:数组排序是根据ASCII数字值来排序。我们在对数组进行排序时,最好先将每个元素转换成小写后再排序。

11 特殊变量:$[

特殊变量 $[ 表示数组的第一索引值,一般都为0, 如果将 $[  设置为1,则数组的第一索引值即为1,第二个为2,以此类推

实例:

一般情况不建议使用特殊变量 $[ ,在新版 Perl 中,该变量已废弃。

12 合并数组

数组的元素是以逗号来分割,我们也可以使用逗号来合并数组,如下:

13 从列表中选择元素

一个列表可以当作一个数组使用,在列表后指定索引值可以读取指定的元素:

哈希是key/value对的集合。 Perl中哈希变量以百分号(%)标记开始。

访问哈希元素格式:${key}

1 创建哈希

一,为每个key设置value

$data{'google'} = 'googlecom';

$data{'w3cschool'} = 'w3cschoolcn';

二,通过列表设置

(1) 列表中第一个元素为key, 第二个元素为value

%data = ('google', 'googlecom', 'w3cschool', 'w3cschoolcn', 'taobao', 'taobaocom');

(2) 也可以使用=>符号来设置key/value

%data = ('google'=>'googlecom', 'w3cschool'=>'w3cschoolcn', 'taobao'=>'taobaocom');

(3) 使用 - 来代替引号

%data = (-google=>'googlecom', -w3cschool=>'w3cschoolcn', -taobao=>'taobaocom');

实例:

2 访问哈希元素

访问哈希元素的格式:${key}

3 读取哈希值

哈希值提取数组 ,语法格式为:@{key1, key2}

4 读取哈希的key和value

读取所有key

可以通过使用 keys 函数读取 哈希所有的键值,语法格式如下:

keys %hash

可以使用 values 函数来读取哈希所有的值,语法格式如下:

values %HASH

5 检测元素是否存在

如果在哈希读取不存在的key/value对,会返回undefined值,且执行时会有警告提醒。为了避免这种情况,可以使用 exists 函数来判断key是否存在,存在的时候读取

6 获取哈希的大小

哈希大小为元素的个数,我们可以通过key或value的所有元素数组,再计算数组元素多少来获取哈希大小

7 哈希中添加或删除元素

添加key/value对可以通过简单的赋值来完成。但是 删除哈希元素需要使用 delete 函数

类似下面的写法,先提取出来,之后直接写入文件

my $H;

open $H, "+>", "outlog";

while (<DATA>) {

if (/\/translation="()"/) {

print $1, "\n";

print $H "$1\n";

}

}

close $H;

__DATA__

/aa=123

/bb=456

/translation="MMMDDD"

/aa=123

/bb=456

/translation="MMMDDD"

/aa=123

/bb=456

/translation="MMMDDD"

#!/usr/bin/perl

#取文件行数

##循环开始清空文件

if (-f "tmpout"){

open FILE,">tmpout";

close FILE;}

open( A, "<", "counttxt" );

            while (<A>) {

            $count = $_;

                        };

print "上次记录的记录数为$count\n";

open(my $fh, '<', 'catalinaout');

$ = 0;

while (<$fh>) {

    ($num=$) if eof;

};

print "文件最新的记录数为$num""\n";

    open( B, ">", "counttxt" );

    print B ("$num\n");

if ( defined($count)  && $num != $count && $num !=0  )

{print "开始处理\n";

     open( C, "<", "catalinaout" ) || die "$!\n";

       while (<C>) {

             if  ($ > "$count" ){ 

              open( D, ">>", "tmpout" );

              print D ("$_\n");

             }

}};

perl命令行参数怎么捕获? perl 获取命令行参数方法,以在windows *** 作系统为例,当我们在命令行中调用PERL程序的时候,我们往往会跟随一些参数,比如输入文件名,和输出文件名之类的信息。这些信息PERL会将它们存储在@ARGV数组中(和C语言一样)。比如在cmd中输入如下命令:

pppl -opcamfile opcamfileini -rcfile rcfiletxt -swapfile swapfiletmp -outfile outfiletxt

PERL会建立一个数组@ARGV=qw/-opcamfile opcamfileini -rcfile rcfiletxt -swapfile swapfiletmp -outfile outfiletxt/;然后我们想把这些信息做何用出就对应的处理数组,从数组中分离我们想要的数据就可以了。如下面的代码所示。shift的默认参数是@ARGV。

while ($#ARGV > -1) {

if ($ARGV[0] =~ /-opcamfile/i){

if ($ARGV[1] !~ /-/) {

$opcamfile = $ARGV[1];

shift;

}

shift;

} elsif ($ARGV[0] =~ /-rcfile/i) {

if ($ARGV[1] !~ /-/) {

$rcfile = $ARGV[1];

shift;

}

shift;

} elsif ($ARGV[0] =~ /-swapfile/i) {

if ($ARGV[1] !~ /-/) {

$swapfile = $AR GV[1];

shift;

}

shift;

} elsif ($ARGV[0] =~ /-outfile/i) {

if ($ARGV[1] !~ /-/) {

$outfile = $ARGV[1];

$outfile =~ s/_sim//g;

shift;

}

shift;

} else {

die 'Unrecognized argument, Exiting';

}

}

问题提问的不很明确。关于常用的文件头,文件尾的 *** 作如下:

跳到文件头。 seek FH, 0, 0;

跳到文件尾: seek FH,0, 2;

判断是否到达文件尾部: if(eof(FH))

以上就是关于Perl语言文件读取与输出全部的内容,包括:Perl语言文件读取与输出、perl oneline的参数解释、Perl:标量,数组,哈希等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9427977.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存