假设我需要删除文件第一行中的每个空格(或任何其他sed的东西,无所谓)。如果我从终端这样做,这将有效:
perl -i -pe 's/ //g if $. == 1' file.txt
但我需要在perl脚本中执行此操作。我可以使用system
执行此操作,但我发现不认为这是从perl脚本中对perl进行系统调用的正确解决方案。
有没有办法让这项工作很好,没有明确的文件打开?
附:当然,模块可以做到这一点,但我对核心功能很感兴趣
的 P.P.S。我需要在文件上执行这些操作
答案 0 :(得分:1)
您可以显式编写-p
命令行开关的功能,
sub pe {
my $f = shift;
local @ARGV = @_;
local $^I = ""; # -i command line switch
local $_;
while (<>) {
$f->();
print;
close ARGV if eof; # reset $. for each file
}
}
pe(
sub { s/ //g if $. == 1 },
"file.txt"
);
答案 1 :(得分:1)
这很有效。
#!/usr/bin/perl
use strict;
use warnings;
my $line = <>;
$line =~ s/ //g;
print $line, <>;
修改强> 这是就地编辑版本。
use strict;
use warnings;
{
local $^I = '.bak';
while (<>) {
s/ //g if $. == 1;
print;
}
}
答案 2 :(得分:0)
这就是你要追求的吗?
$ # Setup
$ for number in {1..9}
> do
> {
> echo words are separated by spaces
> echo lines follow each other
> echo until the end
> } > file.$number
> done
$ cat file.1
words are separated by spaces
lines follow each other
until the end
# Change the files
$ perl -i.bak -e 'while (<>) { s/ //g if $. == 1; print; } continue { $. = 0 if eof; }' file.?
# Demonstrate that all files are affected
$ cat file.1
wordsareseparatedbyspaces
lines follow each other
until the end
$ cat file.8
wordsareseparatedbyspaces
lines follow each other
until the end
$ rm -f file.? file.?.bak
$
很容易使代码仅影响第一个文件的第一行(continue
块通过在命令行中的每个文件的末尾重置$.
来处理它。 / p>
答案 3 :(得分:-1)
使用神奇的<>
运算符迭代文件并更改第1行。
你可以试试这个:
while(my $fh=<>){
$fh=~ s/ //g if($.==1);
print "$fh";
}