Perl sed文件内部脚本

Perl sed文件内部脚本,perl,sed,Perl,Sed,假设我需要删除文件第一行中的所有空格(或任何其他sed内容,无所谓)。如果我从终端执行此操作,则此操作将起作用: perl -i -pe 's/ //g if $. == 1' file.txt 但我需要在perl脚本中完成这项工作。我可以使用system来实现这一点,但我认为这不是从perl脚本中对perl进行系统调用的正确解决方案 是否有任何方法可以在不显式打开文件的情况下使此工作正常进行? 当然,有一些模块可以做到这一点,但我对核心功能感兴趣。 P.P.S.我需要在文件上执行这些操作您可

假设我需要删除文件第一行中的所有空格(或任何其他sed内容,无所谓)。如果我从终端执行此操作,则此操作将起作用:

perl -i -pe 's/ //g if $. == 1' file.txt
但我需要在perl脚本中完成这项工作。我可以使用
system
来实现这一点,但我认为这不是从perl脚本中对perl进行系统调用的正确解决方案

是否有任何方法可以在不显式打开文件的情况下使此工作正常进行?
当然,有一些模块可以做到这一点,但我对核心功能感兴趣。

P.P.S.我需要在文件上执行这些操作

您可以显式地编写

-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"
);
子pe{
我的$f=班次;
本地@ARGV=@;
本地$^I=“”;#-I命令行开关
本地元;;
而(){
$f->();
印刷品;
如果每个文件的eof;#reset$。为,请关闭ARGV
}
}
体育(
sub{s///g如果$.==1},
“file.txt”
);

使用神奇的
操作符迭代文件,并更改为第1行

你可以试试这个:

while(my $fh=<>){
$fh=~ s/ //g if($.==1);
print "$fh";
}
while(我的$fh=){
$fh=~s///g如果($.==1);
打印“$fh”;
}
这很有效

#!/usr/bin/perl

use strict;
use warnings;

my $line = <>;
$line =~ s/ //g;
print $line, <>;
#/usr/bin/perl
严格使用;
使用警告;
我的$line=;
$line=~s///g;
打印$line;
编辑: 这是就地编辑版本

use strict;
use warnings;

{
    local $^I = '.bak';
    while (<>) {
        s/ //g if $. == 1;
        print;
    }
}
使用严格;
使用警告;
{
本地$^I='.bak';
而(){
如果$.==1,则为s///g;
印刷品;
}
}

这就是你想要的吗

$#设置
{1..9}中的数字为$
>做
>     {
>回音词之间用空格隔开
>回音线互相跟随
>呼应到底
>}>文件。$number
>完成
$cat文件.1
单词之间用空格隔开
一行接一行
直到最后
#更改文件
$perl-i.bak-e'while(){s///g如果$.==1;print;}继续{$.=0如果eof;}文件。?
#证明所有文件都受到影响
$cat文件.1
单词由空格分隔
一行接一行
直到最后
$cat文件.8
单词由空格分隔
一行接一行
直到最后
$rm-f文件。?文件.?.bak
$

很容易生成只影响第一个文件第一行的代码(该块通过在命令行中的每个文件末尾重置
$.
来处理该代码)。

print是一个列表运算符,因此该行从文件中打印修改后的第一行,即。,$line,然后是通过操作员读取的文件中的其余行。我不知道
print
也是这样工作的。谢谢。不,不是。也许,我不清楚,但我需要修改文件,而不是STDIN,它只在第一个文件的第一行工作,而不是在每个文件的第一行。当然,这同样适用于问题中的代码。是否要更改文件?是!我想不出为什么每个人都会想到STDIN@因为这就是
perl-pe'..'
所做的。这是怎么回事?使用perl-pe,我从文件中读取。无论如何,添加了-i.
读取命令行(@ARGV>0)中给定的文件,并从STDIN读取其他文件(@ARGV==0)<代码>-i按照perldoc中的说明进行就地编辑可能,我不清楚,但我需要修改文件,而不是STDIN,