-1

次の2つの場合に、Perlを使用してファイル(内容の一部として以下を含む)を変更するにはどうすればよいですか?文字列の正しい位置(最初から2つのスペースで適切な行に書き込む)が重要です。さらに、次の$ {P} / TESTのTESTは一定ではなく、実行中に変化します。したがって、マッチング関数を使用しないでください。元のファイルは次のとおりです。

! List of Campaigns
! -----------------
CAMPAIGN 1
  "${P}/TEST"
  ## widget = uniline

1)「$ {P} / TEST」のすぐ下に二重引用符で囲まれた別の文字列を追加します(例:「$ {P} / XXXXXX」(XXXXXXはプログラムで前に定義されています))。キャンペーンの数に注意してください!したがって、次のようになります。

! List of Campaigns
! -----------------
CAMPAIGN 2
  "${P}/TEST"
  "${P}/XXXXXX"
  ## widget = uniline

2)「$ {P}/TEST」の代わりに「${P}/XXXXXX」を置き換えます。したがって、次のようになります。

! List of Campaigns
! -----------------
CAMPAIGN 1
  "${P}/XXXXXX"
  ## widget = uniline
4

1 に答える 1

0

これはあなたにアイデアを与えるはずです。私はその必要性add_campaignreplace_campaign操作を見て、そこからそれを取りました。データは__DATA__疑似ファイルにあります。

プログラム出力:

$ campaigns.pl
! List of Campaigns
! -----------------
CAMPAIGN 3
  "${P}/TEST"
  "${P}/MONKEY"
  "${P}/BLUE"
  ## widget = uniline

プログラムソース:

#!/usr/bin/perl

use strict;
use warnings;

### main program

# read entire file contents into $data
my $data = do { local $/; <DATA> };

# make an entry in %campaigns for each campaign in $data. Each entry's key 
# is the campaign's name. Its value is irrelevant. We use 1.
my %campaigns;
my $last_campaign_offset;   # index of last campaign found
while ( $data =~ /  "\$\{P\}\/(\w+)"/g ) {
  $campaigns{$1}        = 1;
  $last_campaign_offset = index($data, $');
}

add_campaign('CAMEL');
add_campaign('BLUE');
add_campaign('TEST');   # no-op: campaign already exists
replace_campaign('CAMEL', 'MONKEY');
print $data;


### subroutines

### append a new '  ${P}/FOO' campaign to the data
sub add_campaign {
  my $new_cpn = shift;
  return if exists $campaigns{$new_cpn};

  $new_cpn = qq[\n  "\${P}/$new_cpn"];
  substr($data, $last_campaign_offset) 
    = $new_cpn . substr($data, $last_campaign_offset);
  $last_campaign_offset += length($new_cpn);

  # lastly, increment n in the "CAMPAIGN n" substring
  $data =~ s/(?<=CAMPAIGN )(\d+)/$1 + 1/e;
}

### replace the name of an existing campaign with a new one
sub replace_campaign {
  my ($old_cpn, $new_cpn) = @_;
  $data =~ s/(?<=  "\$\{P\}\/)$old_cpn/$new_cpn/;
}


__DATA__
! List of Campaigns
! -----------------
CAMPAIGN 1
  "${P}/TEST"
  ## widget = uniline
于 2012-04-28T23:09:05.303 に答える