【问题标题】:Perl - using sed or tail to remove first line of a file inline and return 1st line to a varPerl - 使用 sed 或 tail 删除内联文件的第一行并将第一行返回给 var
【发布时间】:2012-05-09 13:06:33
【问题描述】:

这对我来说很新,但是我正在慢慢地接受它。

我需要打开一个文件,将第一行返回给 var 做一些事情,然后在事情成功后从文件中删除第一行。

在 mt 脚本中,除了第一行之外,这里将所有内容都打印到屏幕上。

$file = 'test.txt';

system "tail -n+2 /home/username/public_html/adir/$file";

现在我在这里做了一些探索,发现:

system "sed -i '1d' home/username/public_html/adir/$file";

这应该删除内联文件的第一行。 (我没试过)

如果我也可以将第一行返回到 $variable 来做事,那就完美了。

如果事情失败了,我可以将这一行重新添加到文件中。

我知道我可以用一堆 FILE 用数组来做到这一点,但似乎有点多。

文件很小,不到 100 行,每行 6 个字符。

我是否完全不知道为此追求 sed 或 tail?

如何使用这些系统调用将删除的行作为 $line 返回?

感谢您的学习体验。

【问题讨论】:

  • 您想使用 perl 还是使用 sed 和 tail 的 shell 脚本?请不要使用 perl 来调用系统。
  • 我真的不知道。我试过了,它返回了结果。该脚本是一个基于服务器的 Perl 脚本,它将用户信息从另一个更新到 mysql 表。它将由 cron 触发。 $file 是需要更新的用户 ID 的列表。 id 是触发该用户/行的数据库同步的键。

标签: perl sed tail


【解决方案1】:

我不喜欢将system() 用于perl 出色的任务。

怎么样?

use warnings;
use strict;

open my $fh, q[<], $ARGV[0] or die $!; 

## Read from the filehandle in scalar context, so it will read only
## first line.
my $first_line = <$fh>;

# do stuff with first line...

## And if stuff was successful, read left lines (all but the first one) and
## print them elsewhere. 
while ( <$fh> ) { 
    print;
}

【讨论】:

  • 那会删除文件的第一行吗?这实际上发生在哪里?太棒了。抱歉,对此真的很陌生,想学习力学。 open 语句中的某些内容删除了第一行,然后在最后重新写入/“打印”删除了第一行的文件?
  • @Jim_Bo:我已经更新了在 cmets 中添加解释的答案,但是是的,程序从标量上下文中的文件句柄读取,所以只有第一行,接下来的读取将从第二行到文件结束。
  • 优秀。我试过了,但是文件没有被编辑。显示的结果是完美的。那么,在此期间我会打印 $fh [what] 吗?
  • 这不会改变原始文件。它将新文件内容打印到 STDOUT。您需要将该输出重定向到一个新文件。并将新文件重命名为旧名称。使用 Tie::File 可以避免所有这些。
  • @DaveCross:谢谢。重定向是一个选项,并就地编辑另一个选项。从未使用过Tie::File,但阅读您的答案看起来很有希望。
【解决方案2】:

听起来像是Tie::File 最适合的那种东西。

#!/usr/bin/perl

use strict;
use warnings;
use Tie::File;

my $file = 'test.txt';

tie my @array, 'Tie::File', $file or die "Count not tie file: $file: $!";

my $line = $array[0];

if (do_something_successfully()) {
  shift @array;
}

【讨论】:

  • 好的,在我移开数组中的第一个之后,我假设我使用了 open(FILE, ">, $file");并将修改后的@array 写入成功 if?
  • 喜欢:if (do_something_successfully()) { shift @array;打开文件,q[>],$filetoopen; foreach (@array){ 打印文件 $_;关闭(文件); }
  • 不。 Tie::File 的乐趣在于数组就是文件。如果您更改数组(例如,通过shifting 其第一行),那么您将更改文件。我的代码几乎完成了。您只需要编写do_something_successfully 函数。也许你应该阅读我链接到的文档:-)
  • 谢谢,成功了!我必须安装 Tie::File 但是,伙计,太棒了!!!我不配……
  • 有点担心必须安装 Tie::File。你用的是什么版本的 Perl?自 2002 年 7 月 5.8.0 以来,它一直是 Perl 核心发行版的一部分。您真的应该考虑升级到更新的版本!
猜你喜欢
  • 2014-04-22
  • 2018-05-23
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多