Perl:如何在不读取和复制整个文件的情况下删除文件的第一行

Perl:如何在不读取和复制整个文件的情况下删除文件的第一行,perl,line,Perl,Line,我确实在一个目录中有一大堆文件,我想从每个文件中删除第一行(包括回车)。我可以将整个文件读入字符串数组,并将除第一个元素以外的所有元素写入新文件,但这看起来有点麻烦,有更好的方法吗?哦,首选的语言是Perl。试试这一行 use Tie::File qw(); for my $filename (glob 'some_where/some_files*') { tie my @file, 'Tie::File', $filename or die "Could not open $file

我确实在一个目录中有一大堆文件,我想从每个文件中删除第一行(包括回车)。我可以将整个文件读入字符串数组,并将除第一个元素以外的所有元素写入新文件,但这看起来有点麻烦,有更好的方法吗?哦,首选的语言是Perl。

试试这一行

use Tie::File qw();
for my $filename (glob 'some_where/some_files*') {
    tie my @file, 'Tie::File', $filename or die "Could not open $filename: $!";
    shift @file;
}
perl -pi -e '$_ = "" if ( $. == 1 );' filename
我以前用过,应该是你所需要的

perl -n -i -e 'print unless $. == 1' myfile
这与斯托切里拉克的答案相似

但是,在任何情况下(以及给出的所有其他答案!)您总是在阅读完整的文件。没办法避免,好吧。

怎么样

tail +2
在贝壳里

(编辑:在较新的Linux中,您可能需要
tail-n+2
(谢谢您,GNU!:())

哦,首选的语言是Perl

use Tie::File qw();
for my $filename (glob 'some_where/some_files*') {
    tie my @file, 'Tie::File', $filename or die "Could not open $filename: $!";
    shift @file;
}
有时
sed
甚至比perl更好:

sed -i 1d *

正如Schwern所指出的,以下情况不会像我最初认为的那样提前退出:

perl -pi -e '$_ = q// and last if $. == 1;' myFile

似乎人们终究无法避免处理整个文件。

请注意,这仍然需要读取和复制整个文件,但这是问题的内在原因。我不知道有任何操作系统提供任何其他方法来从文件开头删除数据。Tie::file是我的明显选择,因为它是显式编写来处理此问题的高效地处理问题类别。这是不可能的,因为文件是如何存储的。您将始终必须读取整个文件,并写入除第一行以外的所有内容-操作系统没有其他方法。这与您认为的方法不同。如果这样做,则会违反文件在Unix上的工作方式。真正发生的是
$\=“”
始终为false,因此
$\”“last
0和last
相同。它会短路并且从不调用
last
。您已经编写了:
perl-pi e'$\uq//if$.==1'myFile
,这是一种不打印第一行的聪明方法,但它肯定会读取整个文件。运行with
-MO=Deparse
,以获取代码并在调试器查看。
执行{this;that;}如果某个
是更安全的构造。@Schwern:我的错。你的解释花了一段时间才理解,但我明白你的意思。在MinGW控制台下的Windows中,有人删除了我的文件“不能对我的文件进行就地编辑:权限被拒绝”基本上,它表示运行perl,就地解析并执行下面的代码行。下面的代码行使用默认变量$\在本例中是由-p选项读入的行。$。是文件名的行号。因此,如果行号==1,则将行的文本设置为“”。