1

パイプ実行用にいくつかのPerlスクリプトを変更し、指定された入力パラメーターのセットでそれらを実行するラッパースクリプトを作成する必要があります。その前に、最初のプログラムで何が起こっているのかを理解する必要があります。このコードを解読するのに助けが必要です:

# declare and initialise an empty hash
my %to_keep= ();

# an array
@line = ('some\one', 'two', 'three', 'four');

# trim the identifier
$line[0]=~s/\/[1]$//;

# store this into an array
@{$to_keep{$line[0]}{'1'}}=($line[1],$line[2]);
print @;

私はperl置換関数s///に精通しています。それは行きます:

s/text-regex_to_be_replaced/replacement/modifier. 

ただし、上記のコードが何をしているのかよくわかりません。私が正しく理解していれば、文字列の終わり('$ /'で示される)まで、'\'のすべての出現箇所をline[1]に置き換えます。これは正しいです?

私が確信していない他の部分は、「store」コメントの下のコードです。配列のハッシュを配列に格納していると思います。誰かがコードがどのように機能し、変数が与えられたときに何を出力するかを説明できますか?また、配列に格納しているデータを取得するにはどうすればよいですか?

ボーナスの質問:パイプ実行用のperlスクリプトの変更がどのように機能するかを誰かが説明できますか?

ありがとう

4

1 に答える 1

1

うーん、これは有線です。

s/\/[1]$//; 

文字列の最後にある/1のみを照合して削除します。したがって、あなたの例では、影響はありません。

@{$to_keep{$line[0]}{'1'}}=($line[1],$line[2]);

分解すると、左側に $to_keep{'some\one'}{1}例で定義されていないものがあります!しかし、それがあなたに値を与えると言うなら、fooあなたはこの値を取り、それに置き換えます。@{foo}これは基本的にその値fooを配列名として使用することを意味します@foo

右側では、の2番目と3番目の要素を$lineリストとしてこの変数名に保存します@foo

未定義を無視して意図を推測しようとすると、独自の変数名を定義するスクリプトが得られます。リストの最初の要素を変数名として使用し、それをリストの残りの部分と等しく設定します

于 2012-06-06T21:02:14.487 に答える