2017-03-09 6 views
-1

私はこのようにいくつかのエントリを含むファイルを持っている:検索は、バージョン番号をインクリメントし、Perlで保存

 Banana1015 { 
      versionName "1.0.2" 
      versionCode 4 
     } 

     BeachRadio { 
      versionName "1.0.0" 
      versionCode 1 
     } 

     BIGFROG104 { 
      versionName "1.0.3" 
      versionCode 4 
     } 
私は私がのパラメータを渡すことができる場所perlスクリプトを作成したいと思います

このファイルで検索するエントリ(つまり "BeachRadio")を入力し、そのエントリのversionNameとversionCodeをインクリメントしてファイルを保存します。これはversionNameの3番目の小数点以下の桁数をデフォルト値として増やすことができますが、理想的には、メジャーバージョン、マイナーバージョン、またはパッチバージョンの増分を可能にするパラメータを渡すことができます。

#!perl -w 
$file="build.gradle"; 

open my $fh, "<", $file or die $!; 

while (<$fh>) { 
    print if /BeachRadio/ .. /}/; 
} 

私はこれで任意の助けに感謝:それは「BeachRadio」エントリを見つけたとき、私がこれまで持っているもの

は、単にファイルを読み出して出力。

+3

これはすべて、プログラムの説明です。しかし、あなたは[質問する]必要があります(http://stackoverflow.com/help/how-to-ask)。私たちはあなたが私たちから何を望んでいるかを確信することはできません私たちが答えることができる有効な質問を含めるために投稿を編集してください。リマインダー:あなたが知っていることを確認してください(ここには何が話題になっていますか?)(http://stackoverflow.com/help/on-topic)。 –

答えて

1

ファイル形式は、一つの方法は、段落で読み取ることがあることを考えます。次に、各段落を文字列に読み込みます。文字列には、直線正規表現を使用できます。段落を読むために、input record separator ($/)を設定しました。

残りのビットは、//が逃げることなく、内部で使用できるように、私は正規表現で{}{}区切り文字を使用

use warnings; 
use strict; 
use Getopt::Long; 

my $file = 'build.gradle'; 
my $section = 'BeachRadio'; # default to test 
my ($major, $minor, $patch); 
GetOptions(
    'file=s' => \$file, 'section=s' => \$section, 
    'major=i' => \$major, 'minor=i' => \$minor, 'patch=i' => \$patch, 
) or die "Usage: $0 ..."; 


{ # limit scope of $/ change if there is other code 
    local $/ = "\n\n"; 

    open my $fh, '<', $file or die "Can't open $file: $!"; 
    while (<$fh>) 
    { 
     if (/^\s*$section\s*{/) 
     { 
      s{versionName\s*"\K(\d+)\.(\d+)\.(\d+)} 
      {join '.', $major//$1, $minor//$2, $patch//($3+1)}e; #" 

      s/versionCode\s*\K(\d+)/$1+1/e; 
     } 
     print; # or write to file 
    } 
} 

を提出してきたこれらのパラメータの値を変更することです。

\Kは、特定の形式のpositive lookbehind(?<=pattern)です。以前のすべての一致が破棄されます。したがって、交換部品にすべてを戻す必要はありません。ちょうど\Kにマッチした部分です。

/e修飾子のため、置換側はコードとして評価されます。置換文字列は、.によって指定された値(定義されている場合)または既存の値のいずれかの数字ごとに置換されて、joinによって形成されます。これはdefined-or //演算子を使用します。 最後の数字は、少なくとも1つ増加します(デフォルト)。

誤ったファイル/行形式のエラー処理はありません。必要に応じて小切手を追加してください。

これは、テストのすべての呼び出しで予想される出力を出力します。

+0

それは良いようですが、私はこのエラーが表示されます:version_increment.pl 25行目のprintで初期化されていない値$ _を使用してください。<$fh>行2055. – codeman

+0

@codemanコマンドラインオプション 'Getopt :: Long'を使用します。すべての呼び出しでテストされます。 – zdim

+0

ありがとう!ほんとうにありがとう。 – codeman

0

あなたはこのような何かを試みることができる:

use feature qw(say); 
use strict; 
use warnings; 

my $fn = 'build.gradle'; 

my $arg = shift; 
open (my $fh, '<', $fn) or die "Could not open file '$fn': $!"; 
my $str = do { local $/; <$fh> }; 
close $fh; 

if ($str =~ /^\s*\Q$arg\E\s*{/mg) { 
    if ($str =~ /\s*versionName\s*"\d+\.\d+\./sg) { 
     my $save_pos = $+[0]; 
     $str =~ s/\G(\d+)/$1+1/e; 
     pos($str) = $save_pos; 
     $str =~ s/\G\d+"\s*versionCode\s*\K(\d+)/$1+1/se; 
    } 
    print $str; 
} 
+0

それはファイル全体を出力したが、変更をしなかった – codeman

+0

もしそれがファイルを変更しなかったならば:出力をファイルにリダイレクトする。もしあなたが好きならば、Perlスクリプト内の出力を保存することができる。 –

+0

それは私が検索したもののversionNameをインクリメントしませんでした。 – codeman

関連する問題