次のように出力を返す ec2-describe-instancesからの出力を処理する Perl スクリプトに取り組んでいます。
INSTANCE\n
TAG\n
INSTANCE\n
TAG\n
INSTANCE\n
TAG\n
結果が次のような 2 つの行のチャンクに分割されるように分割機能を使用できる方法はありますか?
INSTANCE\n
TAG\n
次のように出力を返す ec2-describe-instancesからの出力を処理する Perl スクリプトに取り組んでいます。
INSTANCE\n
TAG\n
INSTANCE\n
TAG\n
INSTANCE\n
TAG\n
結果が次のような 2 つの行のチャンクに分割されるように分割機能を使用できる方法はありますか?
INSTANCE\n
TAG\n
の最初の引数は、split返されるものを区切るものでなければなりません。
split /(?!^)(?=(?:.*\n.*\n)+\z)/, do { local $/; <> };
しかし、それは非常に非効率的です。
ハンドルに出力したい場合は、次を使用できます。
perl -pe'()=split//,""; print "\n" if $. % 2 == 1 && $. > 1'
これは次のようになります:
()=split//,"";
while (<>) {
    print "\n" if $. % 2 == 1 && $. > 1;
    print;
}
( を省略することを強くお勧めし()=split//,"";ます。)
$.最後に読み取った行の行番号。
配列に出力する場合は、次を使用できます。
()=split//,""; 
my @array;
my $buf;
while (<>) {
   $buf .= $_;
   if ($. % 2 == 1) {
      push @array, $buf;
      $buf = '';
   }
}
( を省略することを強くお勧めし()=split//,"";ます。)
すべてをメモリにロードしても問題ない場合は、次を使用できます
()=split//,"";
my @array = do { local $/; <> } =~ /\G.*\n.*\n/g;
( を省略することを強くお勧めし()=split//,"";ます。)