一 读取一行
读取一行的方式有两种,分别为: (1) 使用方法 readline(FILEHANDLE) ; (2) 使用符号<>
# my 申明为局部变量,作用域 my $filename = "a.txt"; my $encoding = ""; my $handle = undef; #打开 open($handle,"<",$filename) || die "$0 : can't open $filename for reading:$!"; #read a line,读取时包含该行的\n符号也会读取 方式一 $line = <$handle>; #去除行的\n chomp($line); print $line; #read a line 方式二 $line = readline($handle); print $line; #关闭 close($handle);
二 读取所有行到列表中
使用 @array = <FILEHANDLE>
my $filename = "a.txt"; my $encoding = ""; my $handle = undef; open($handle,$filename) || die "$0 : can't open $filename for reading:$!"; #read a line $line = <$handle>; print $line; #把剩余的行都读取到一个list里面 @arr = <xxFile>; #遍历@arr foreach $a (@arr) { print $a; } close($handle);
三 写入一行
使用 print FILEHANDLE LIST
#写文件 $xxfilename = "xx.txt"; # 写入模式 >表示覆盖之前的文件,>>表示追加在文件的尾部 open (xxFile,">>",$xxfilename) or die "could not open $xxfilename : $!"; print xxFile ("aaaaaaaaaaabbdd\n");#注意圆括号前有空格,若没有则会出错提示为undefined subroutine &main::xxFile close(xxFile);
四 复制文件,一行对一行
#把一个文件的内容复制到另外一个文件中 $srcFilename = "xx.txt"; $destFilename = "out.txt"; open(srcFile,$srcFilename) or die "file could not open $srcFilename : $!"; open(destFile,">",$destFilename) or die "file could not open $destFilename : $!"; #循环写入,读取一行,写入一行 while($line = <srcFile>) { print destFile ($line); } close(srcFile); close(destFile);
五 复制文件,读取任意字节数
读取:read FILEHANDLE,SCALAR,LENGTH
写入:syswrite FILEHANDLE,SCALAR
my $buffer = undef; my $BUFSIZE = 4 * (2 ** 10); my $srcFilename = "a.txt"; my $srcHandle = undef; my $destFilename = "a_dest.txt"; my $destHandle = undef; open($srcHandle,$srcFilename) || die "$0 can't open $srcFilename : $!"; open($destHandle,$destFilename) || die "$0 can't open $destFilename : $!"; while(read($srcHandle,$buffer,$BUFSIZE)) { unless(syswrite $destHandle,$buffer){ #当写入出错时会执行unless里的语句,与if语句相反 die "can't write to $destFilename : $!"; } } #关闭文件 close($srcHandle) || die "can't close $srcFilename : $!"; close($destHandle) || die "can't close $destFilename : $!";
六 复制二进制文件
对二进制文件(如图片)进行操作时,与普通文件不一样,需要对文件引用对进行处理,使用 binmode FILEHANDLE
#操作二进制文件 my $buffer = undef; my $BUFSIZE = 4 * (2 ** 10); my $srcFilename = "bg1.png"; #my $encoding = ":encoding(UTF-16LE)"; my $srcHandle = undef; my $destFilename = "bg1_dest.png"; my $destHandle = undef; #打开二进制文件 open($srcHandle,$destFilename) || die "$0 can't open $destFilename : $!"; ##二进制处理## for my $handle($srcHandle,$destHandle) { binmode($handle) || die "binmode Failed"; } while(read($srcHandle,$buffer){ #当写入出错时会执行unless里的语句,与if语句相反 die "can't write to $destFilename : $!"; } } #关闭文件 close($srcHandle) || die "can't close $srcFilename : $!"; close($destHandle) || die "can't close $destFilename : $!";