gpt4 book ai didi

perl - 在 perl 中打开文件进行读写(不附加)

转载 作者:行者123 更新时间:2023-12-04 05:43:27 25 4
gpt4 key购买 nike

标准 perl 库有什么方法可以打开文件并对其进行编辑,而不必关闭它然后再次打开它?我所知道的就是将文件读入字符串关闭文件,然后用新文件覆盖文件;或读取然后附加到文件的末尾。

以下目前有效,但;我必须打开它并关闭它两次,而不是一次:

#!/usr/bin/perl
use warnings; use strict;
use utf8; binmode(STDIN, ":utf8"); binmode(STDOUT, ":utf8");
use IO::File; use Cwd; my $owd = getcwd()."/"; # OriginalWorkingDirectory
use Text::Tabs qw(expand unexpand);
$Text::Tabs::tabstop = 4; #sets the number of spaces in a tab

opendir (DIR, $owd) || die "$!";
my @files = grep {/(.*)\.(c|cpp|h|java)/} readdir DIR;
foreach my $x (@files){
my $str;
my $fh = new IO::File("+<".$owd.$x);
if (defined $fh){
while (<$fh>){ $str .= $_; }
$str =~ s/( |\t)+\n/\n/mgos;#removes trailing spaces or tabs
$str = expand($str);#convert tabs to spaces
$str =~ s/\/\/(.*?)\n/\/\*$1\*\/\n/mgos;#make all comments multi-line.
#print $fh $str;#this just appends to the file
close $fh;
}
$fh = new IO::File(" >".$owd.$x);
if (defined $fh){
print $fh $str; #this just appends to the file
undef $str; undef $fh; # automatically closes the file
}
}

最佳答案

您已经通过使用模式打开文件 <+ 来打开文件进行读写。 ,你只是没有用它做任何有用的事情——如果你想替换文件的内容而不是写入当前位置(文件的末尾),那么你应该 seek回到开头,写你需要的,然后truncate以确保如果您将文件缩短,则不会有任何剩余。

但是由于您要做的是对文件进行就地过滤,我是否建议您使用 perl 的就地编辑扩展,而不是自己完成所有工作?

#!perl
use strict;
use warnings;
use Text::Tabs qw(expand unexpand);
$Text::Tabs::tabstop = 4;

my @files = glob("*.c *.h *.cpp *.java");

{
local $^I = ""; # Enable in-place editing.
local @ARGV = @files; # Set files to operate on.
while (<>) {
s/( |\t)+$//g; # Remove trailing tabs and spaces
$_ = expand($_); # Expand tabs
s{//(.*)$}{/*$1*/}g; # Turn //comments into /*comments*/
print;
}
}

这就是您需要的全部代码——perl 处理其余的。设置 $^I variable相当于使用 -i commandline flag .在此过程中,我对您的代码进行了几处更改 -- use utf8对源代码中没有文字 UTF-8 的程序没有任何作用, binmode使用 stdin 和 stdout 对从不使用 stdin 或 stdout 的程序没有任何作用,保存 CWD 对从不使用的程序没有任何作用 chdir s。没有理由一次全部读取每个文件,所以我将其更改为逐行,并使正则表达式不那么尴尬(顺便说一句, /o 正则表达式修饰符如今几乎毫无用处,除了添加难以-查找代码中的错误)。

关于perl - 在 perl 中打开文件进行读写(不附加),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4481643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com