2017-02-04 2 views
1

ここに私がやろうとしていることの例があります: 入力の名前を定義しておき、それが関数に取り込まれたときにのみそれを代用しますすべての3つの変数。 Perl:変数内の変数の文字列

$place_holder = 'f${file_case}_lalal_${subcase}_${test}'; 

....どこか別の関数で:

while(<IN>){ 
    ($file_case, $subcase, $tset) = split; 
    $input = $place_holder #### line #3 here needs to fix 
    print " $input \n"; 
} 

残念ながら、それぞれ$ file_caseを表す線、$のサブケース、$テストの数字の3セットを含む読み込みファイル1行ごとにf $ {file_case} lalal $ {subcase} _ $ {test}を出力します。これらの変数を代用したい。どのようにすればいいですか? 行3を変更して私が望むように出力できるのはどうですか?私は、サブルーチンで入力名を定義したくないので、メインになければなりません。

+1

高速かつ正確なノートであるので、モジュールは、二重引用符の補間を行い、Perlの組み込みCコードへのアクセスを提供します。この

use String::Interpolate 'interpolate'; my $place_holder = 'f${file_case}_lalal_${subcase}_${test}'; while (<IN>) { my ($file_case, $subcase, $test) = split; my $input = interpolate($place_holder); print "$input\n"; } 

のように、String::Interpolateモジュールを使用することがあります。補間は二重引用符で囲まれた文字列でのみ起こりますが、あなたの例は一重引用符で囲まれています。 –

+0

私は知っています。 $ place_holderはその時点で関数のように動作し、3つの変数はまだ分かっていません。したがって、置換されることはありません。しかし、$ place_holderは、ユーザーが好きなものに簡単に変更できる場所にある必要があります。残りの置換は、ユーザーが変更する必要のない関数に隠されています。 –

答えて

3

あなたはそれは私がそれから利益を得ることができる用途を見込んでanonymous subroutinecode referenceを使用しました

use warnings; 
use strict; 

my $place_holder = sub { 
    my ($file_case, $subcase, $test) = @_;  
    return "f${file_case}_lalal_${subcase}_${test}"; 
} 

# ... 

while (<IN>) { 
    my ($file_case, $subcase, $tset) = split; 
    # 
    # Code to validate input 
    # 
    my $input = $place_holder->($file_case, $subcase, $tset); 
    print "$input\n"; 
} 

あなたの基準を満たしている場合、それは例えばサブルーチンを使用して行う、それだけで指定されたタスクのためにすることができます通常のサブルーチンも使用できます。

$test$tsetがありますが、上記には影響しませんが、誤植かもしれないことに注意してください。私が掲示した後、私はそれを行うための方法を見つけながら

+0

ありがとうございます。それは確かにエレガントに動作させる一つの方法です。 –

+0

@OngBengSeongありがとうございます。私が気づいた点は、管理の容易さのために処理の段階を分けている点です(例えば、正確な変数名は関係ありません)、必要に応じてコード参照を渡すことができ、ユーザ入力を評価する。 – zdim

+0

12種類のファイル名があり、サブルーチンスタイルの場合 my $ file_name = sub { } –

-1

evalのwhile(<IN>){ ($file_case, $subcase, $tset) = split; $input = eval $place_holder #### line #3 here needs to fix print " $input \n"; }

+0

残念ながら私はこれを試してみましたが、うまくいきません。ありがとうございました。 –

+0

どのようなエラーがありますか?選択しなかった場合は、ソリューションと同じです。そうすればうまくいくはずです。 – tuxuday

0

Aを試してみてください。 ##ライン3における

、これを行う:

($入力= $ place_holder)=〜S /({+ W} \ $)/ $ 1/EEGと、

などすべてが機能します。はい、上記のtsetはテスト用のtypoです。皆様のご返信ありがとうございます。

+1

これは私が最初に警告したものです。ユーザーの入力を評価します。それは本質的に危険です。私は可能性のある悪意のみを意味するわけではありませんが、単純なタイプミスや間違ったデータを評価してコードに混乱を招く可能性があります。この 'eval'は、' $ 1'の内容を任意のPerlコード_として扱います。 (これは早いコメントでそれに言及しているにもかかわらず、私の答えでそれを言及しなかった理由です。)別の方法があれば、これをしないことを強くお勧めします。 – zdim

+0

前のコメントで「_user input_」と書かれていたので、データからの入力も意味していました。 "データ"ファイルに何が含まれているかはわかりません。 '/ ee'の前に広範囲にデータを検証する必要があるというコメントを追加します。これには' eval'が含まれます。 – zdim

+0

あなた自身で実用的な解決策を見つけて投稿したことは良いことです(btw、私はそれをdownvoteしませんでした)。 – zdim

2

あなたはそれが一般的に

関連する問題