如何在Perl中操作文件指针

如何在Perl中操作文件指针,perl,file-io,file-pointer,Perl,File Io,File Pointer,因此,我正在阅读一个日历文件,在文件中插入一个日期,我希望这些日期保持时间顺序。当我找到日期应该放在哪里时,问题来了,文件已经超出了我要插入的点 我正在查看的日历文件如下所示: # November 2010 11/26/2010 11/27/2010 11/28/2010 11/29/2010 11/30/2010 # December 12/24/2010 12/25/2010 12/26/2010 12/27/2010 12/28/2010 12/29/2010 12/30/2010 w

因此,我正在阅读一个日历文件,在文件中插入一个日期,我希望这些日期保持时间顺序。当我找到日期应该放在哪里时,问题来了,文件已经超出了我要插入的点

我正在查看的日历文件如下所示:

# November 2010
11/26/2010
11/27/2010
11/28/2010
11/29/2010
11/30/2010
# December
12/24/2010
12/25/2010
12/26/2010
12/27/2010
12/28/2010
12/29/2010
12/30/2010
while (my $line = <FILE>) {
    if (substr($line, 0, 1) =~ m/\#/ || $line =~ m/calendar/) { #if the line is commented out or contains the calendar's name skip to next line
        next;
    }
    chomp($line);
    my ($temp_month, $temp_day, $temp_year) = split(/\//, $line, 3);
    if ($year == $temp_year && $month == $temp_month && $day < $temp_day) {
        ?
    }
}
我的代码如下所示:

# November 2010
11/26/2010
11/27/2010
11/28/2010
11/29/2010
11/30/2010
# December
12/24/2010
12/25/2010
12/26/2010
12/27/2010
12/28/2010
12/29/2010
12/30/2010
while (my $line = <FILE>) {
    if (substr($line, 0, 1) =~ m/\#/ || $line =~ m/calendar/) { #if the line is commented out or contains the calendar's name skip to next line
        next;
    }
    chomp($line);
    my ($temp_month, $temp_day, $temp_year) = split(/\//, $line, 3);
    if ($year == $temp_year && $month == $temp_month && $day < $temp_day) {
        ?
    }
}
while(我的$line=){
if(substr($line,0,1)=~m/\\\\\\\\\\\\\\\\\\\\\\\\\\\\$line=~m/calendar/){如果该行被注释掉或包含日历名称,请跳到下一行
下一个
}
chomp($line);
我的($temp\u month,$temp\u day,$temp\u year)=拆分(/\/,$line,3);
如果($year==$temp\u year&$month==$temp\u month&$day<$temp\u day){
?
}
}

那么,对于如何指向文件中的前一个点,有什么建议吗?

标准的perl解决方案是对问题使用内存:

open( my $FILE, ....); #open in read/write mode my @lines = <FILE>; #slurp in all lines of file ... insert (or delete?) into array ... truncate( $FILE, 0 ); #if deleting, you will need to truncate seek( $FILE, 0, 0 ); print $FILE @lines; 打开(我的$FILE,…)#以读/写模式打开 我的@lines=#在文件的所有行中发出咕噜声 ... 将插入(或删除?)到数组中。。。 截断($FILE,0)#如果删除,则需要截断 搜索($FILE,0,0); 打印$FILE@行;
为了提高效率,您可以从更改的角度而不是从所有方面进行编写,但是如果速度不重要,那么简单性就没有那么多潜在的bug

标准的perl解决方案是对问题使用内存:

open( my $FILE, ....); #open in read/write mode my @lines = <FILE>; #slurp in all lines of file ... insert (or delete?) into array ... truncate( $FILE, 0 ); #if deleting, you will need to truncate seek( $FILE, 0, 0 ); print $FILE @lines; 打开(我的$FILE,…)#以读/写模式打开 我的@lines=#在文件的所有行中发出咕噜声 ... 将插入(或删除?)到数组中。。。 截断($FILE,0)#如果删除,则需要截断 搜索($FILE,0,0); 打印$FILE@行;
为了提高效率,您可以从更改的角度而不是从所有方面进行编写,但是如果速度不重要,那么简单性就没有那么多潜在的bug

需要在文件中随机移动的函数是。但是在Perl常见问题解答中有更多关于如何解决这个问题的信息-

在文件中随机移动所需的函数是。但是在Perl常见问题解答中有更多关于如何解决这个问题的信息-

,它将解决回退问题。最终将覆盖当前的现有行。懒惰的解决方案是使用,另一种可能是它在写出新版本时读取一个文件,然后在完成后用新版本替换旧版本。

并将解决回卷问题。最终将覆盖当前的现有行。懒惰的解决方案是使用,另一种可能是在编写新版本时读取一个文件,然后在完成后用新版本替换旧版本。

这听起来对模块很有用。您可以将文件视为数组,而不必担心文件指针的当前位置。它也不依赖于将整个文件加载到内存中,因此它可以处理大量文件

use Tie::File;

tie @array, 'Tie::File', $file;

for (my $i =0; $i <= @array; $i++) {
    if (/date comparison/*see note below) {
        splice @array, $i, 0, $new_date;
    }
}
使用Tie::File;
tie@array,'tie::File',$File;

对于(my$i=0;$i这听起来像是模块的一个很好的用途。您可以将文件视为一个数组,而不必担心文件指针的当前位置。它也不依赖于将整个文件加载到内存中,因此可以处理大量文件

use Tie::File;

tie @array, 'Tie::File', $file;

for (my $i =0; $i <= @array; $i++) {
    if (/date comparison/*see note below) {
        splice @array, $i, 0, $new_date;
    }
}
使用Tie::File;
tie@array,'tie::File',$File;

对于(my$i=0;$i如果存在任何并发问题,最好先写一个新文件,然后将其重命名为原始文件名。如果存在并发问题,锁定可能比重命名要好。但是,锁定和重命名在所有情况下都更安全。如果存在任何并发问题,最好先写一个新文件,然后重新命名将其命名为原始文件名在出现并发问题时,锁定可能比重命名好。但是,锁定和重命名在所有情况下都更安全。为什么不将日期打印到新文件中?这样就可以很容易地将打印语句按正确的顺序排列。为什么不将日期打印到新文件中?然后可以将打印语句放在新文件中按正确的顺序排列是很容易的。