博客
关于我
perl 文件/路径 读写删
阅读量:292 次
发布时间:2019-03-01

本文共 3899 字,大约阅读时间需要 12 分钟。

读取与处理文件

在 Perl 中处理文件是开发中常见的操作之一。本节将介绍几种常用的读取文件方法,以及文件路径处理的技巧。

读取文件(简单方法)

以下是一个简单的读取文件并将内容一次性加载到数组中的方法:

$fdr = open("<$file") or die $!; # 打开文件
@lines = <$fdr>; # 读取所有内容到数组
close($fdr); # 释放资源

这种方法适用于逐行处理文件时不需要显式循环的情况。

读取文件(逐行处理)

如果需要对每一行进行处理,可以使用 while 循环:

$fdr = open("<$file") or die $!;
while (<$fdr>) {
# 处理当前行
my $line = $_;
# 可以根据需要进行修改或输出
say $line;
}
close($fdr);

这种方法适合需要对每一行单独处理的场景。

读取路径下的文件

要读取特定路径下的所有文件,可以使用 readdir 函数结合 glob 来获取文件列表:

my $dir = "/bld/xyz/toolgeneric/328";
@files = glob("$dir/*/*");

这里,glob 函数会返回匹配路径下的所有文件。


删除文件或文件夹(基于时间)

如果需要删除一些旧文件或文件夹,可以参考以下脚本。脚本会检查文件的创建时间,删除超过一年前的文件。

#!/opt/exp/bin/perl -w
use File::Path;
my $subdir = "/home/coolclf/rje/apaloads";
@files = glob("$subdir/*");
foreach my $file (@files) {
my $mtime = (stat($file))[9]; # 获取文件创建时间
my @t = localtime($mtime);
my $date = sprintf("%02u/%02u/%02u %02u:%02u:%02u", $t[4] + 1, $t[3], $t[5] % 100, $t[2], $t[1], $t[0]);
print "$date\n";
if ($t[5] % 100 < 13) {
print "line15: $file\n";
rmtree($file); # 删除文件夹
}
}

路径遍历(递归)

以下是一个递归遍历路径的示例,能够深入访问文件夹中的所有文件和子文件夹:

#!/opt/exp/bin/perl -w
use strict;
use warnings;
sub lsr {
my $cwd = shift; # 获取当前工作目录
local *DH; # 定义一个目录句柄
if (!opendir(DH, $cwd)) {
warn "无法打开目录 $cwd: $! $^E";
return;
}
foreach (readdir(DH)) {
next if $_ eq '.' || $_ eq '..'; # 跳过当前目录和上级目录
my $file = $cwd . '/' . $_;
if (!-l $file && -d $_) {
$file .= '/'; # 确保是路径
lsr($file); # 递归处理子文件夹
}
# 可以在这里处理文件或文件夹
process($file, $cwd);
}
closedir(DH);
}
my ($size, $dircnt, $filecnt) = (0, 0, 0);
sub process($$) {
my $file = shift; # 接收文件路径
if (substr($file, -1, 1) eq '/') {
$dircnt++;
} else {
$filecnt++;
$size += -s $file; # 计算文件大小
}
}
lsr('.'); # 从当前目录开始递归
print "总共有 $filecnt 个文件,$dircnt 个目录,总大小 $size 字节。\n";

关于输入输出操作

在 Perl 中,处理输入输出时,通常会使用不同的方式来读取和写入文件。为了避免数据丢失或覆写,建议分别使用不同的文件句柄。例如:

open(my $fh, '<', '1-2.txt') or die $!; # 读取文件
open(my $fw, '>', 'output.txt') or die $!; # 写入文件
while ($line = <$fh>) {
print $fw $line;
}
close($fh);
close($fw);

这种方式避免了读写同一文件可能出现的数据丢失问题。


命令行参数处理

如果需要从命令行读取参数,可以使用 ARGV 变量来获取:

my $file = $ARGV[0]; # 获取第一个命令行参数
open(my $fh, '<', $file) or die $!;
while ($line = <$fh>) {
# 处理每一行
if ($line =~ /^bjmcl0(\d\d)/) {
if ($1 >= 33 && $1 <= 63) {
$line = "#$line";
}
}
say $line;
}

文件遍历(子目录)

以下是一个遍历子目录文件的示例:

#!/opt/exp/bin/perl -w
my $dir = "/bld/xyz/toolgeneric/328";
@files = glob("$dir/*/*");
foreach my $file (@files) {
print "line10: $file\n";
open(my $fh, $file) or next;
while ($line = <$fh>) {
if ($line =~ /xyz/) {
print "xyz line17: $file: $line\n";
}
}
close($fh);
}

特殊变量(INPLACE_EDIT)

以下是一个使用 $^I 变量的示例,用于在读写同一文件时临时备份文件:

#!/usr/bin/perl -w
use strict;
$^I = '.bak'; # 设置备份扩展名
while (<$ARGV>) {
s/felixzh1//g;
print;
}

文件大小与目录统计(递归)

以下是一个统计当前目录中文件、子目录和总大小的示例:

#!/opt/exp/bin/perl -w
use strict;
use warnings;
sub lsr {
my $cwd = shift;
local *DH;
if (!opendir(DH, $cwd)) {
warn "无法打开目录 $cwd: $! $^E";
return;
}
$size = 0;
$dircnt = 0;
$filecnt = 0;
foreach (readdir(DH)) {
next if $_ eq '.' || $_ eq '..';
my $file = $cwd . '/' . $_;
if (!-l $file && -d $_) {
$file .= '/'; # 确保是路径
lsr($file, $cwd);
}
process($file, $cwd);
}
closedir(DH);
}
my ($size, $dircnt, $filecnt) = (0, 0, 0);
sub process($$) {
my $file = shift;
if (substr($file, -1, 1) eq '/') {
$dircnt++;
} else {
$filecnt++;
$size += -s $file;
}
}
lsr('.');
print "$filecnt 文件,$dircnt 目录,总大小 $size 字节。\n";

以上是一些常用的 Perl 文件操作示例,涵盖了读取、写入、删除、路径遍历等功能。通过合理组合这些操作,可以应对各种文件处理需求。

转载地址:http://qwfx.baihongyu.com/

你可能感兴趣的文章
Nginx运维与实战(二)-Https配置
查看>>
Nginx配置ssl实现https
查看>>
Nginx配置TCP代理指南
查看>>
Nginx配置——不记录指定文件类型日志
查看>>
Nginx配置代理解决本地html进行ajax请求接口跨域问题
查看>>
Nginx配置参数中文说明
查看>>
Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
查看>>
Nginx配置如何一键生成
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
NHibernate学习[1]
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>