2016-09-29 2 views
4

Scienceの記事に掲載されているツールを使用していますが、私はPerlに精通していないので、多くのトラブルを抱えています。

コードが含まれています

return $equa if /\@BOUNDARY/; 

私はコードは、それがテキスト@BOUNDARYが含まれている場合$equaを返すことになっているが、それはそれをしないと信じています。提供されたコードに間違いがありますか?

私はそれを変更することを考えています:

if ($equa =~ /\@BOUNDARY/) { 
    return $equa; 
} 

これは、同じ機能を実行していますか?


は参考のため、元のコードでは、全体の機能は次のとおりです。

sub correctBoundaryReac { 
    my $equa = shift; 
    print $equa; 
    return $equa if /\@BOUNDARY/; 
    my($left, $arrow, $right) = ('', '', ''); 
    if($equa =~ /^(<--|<==>|-->) (.+)/){ 
     $arrow = $1; 
     $right = $2; 
     $left = $right; 
     $left =~ s/\@\S+/\@BOUNDARY/g; 
    } 
    elsif($equa =~ /(.+) (<--|<==>|-->)$/){ 
     $left = $1; 
     $arrow = $2; 
     $right = $left; 
     $right =~ s/\@\S+/\@BOUNDARY/g; 
    } 
    else{ 
     die "Don't know how to fix bounadry reaction: $equa\n"; 
    } 
    return "$left $arrow $right"; 
} 
+6

'ますreturn $ equa場合/ \を使用することは完全に大丈夫です、その場合には、使用されている必要があることをapears $ _ =〜/ \ @ BOUNDARY /; '$ equaと$ _ – toolic

+1

の2つの変数があります。'/$ pattern/'は、デフォルト変数' $ _'に現在保持されているものにマッチを適用します。だから、あなたが提供しているのは何ですか?たとえば、 'for(@arr)'には、配列要素を反復する際に '$ _'に配列要素があります。これは一例に過ぎず、 '$ _'はPerlで多く使われています。前のコードを見て、 '$ _'で何が保持されているのかを見てください。 – zdim

+0

コードを変更すると、コードは機能しますか? – toolic

答えて

4

説明したように、if (/$pattern/)は、if ($_ =~ /$pattern/を意味します)。 General Variables in perlvarを参照してください。次に、質問は–あなたが表示するコードには$_に入っていますか?

Perlの組み込み関数と演算子の多くは、デフォルトで$_を使用します。しかし、サブルーチン私は知っている限り、何でも$_を使用しないでください。 @_は引数を取得しますが、全く異なる変数です。これは、あなたが表示コードに意図されている場合

しかしながら、副の内部サブの囲み範囲から$_

use feature 'say'; 

sub show_it { say "I see: $_" } 

for ('a'..'c') { 
    show_it(); # prints with a through c 
} 

表示され、それが意味する変数$_におけるパターン'@BOUNDARY'用サブチェック–ですが、サブが呼び出されるスコープからのものです。これは良いことではなく、微妙なバグにつながる可能性があります。呼び出しスコープ内のコードが変更されたときはいつでも、サブをレビューする必要がありますが、サブインターフェイスを介して警告されません($_はパラメータではありません)。さらに、呼び出しコードがその呼び出しをチェックして調整できるので、これは必要ではありません。

私はむしろ、何を示しては、それはこれがサブ最初にチェックが入力すでにこれを持っているかどうか、それがなければ、それだけで返すことを意味する

return $equa if $equa =~ /\@BOUNDARY/; 

である必要があり、その場合には、単純なバグであると信じていますそれ。示されたコードの残りの部分がこれをサポートしています。それはすべて約'@BOUNDARY'です。

1

これは難解な芸術に開始されていない人のための非常に直感的であるPerlの主義です。

Perlには、いわゆる「隠れ変数」$_があります。本質的に、このような単一の引数または比較を伴う関数呼び出しは、実際には、欠損値の代わりに$_の値を代入します。例えば、

foo() if /bar/; 

が実際に同等である

if ($_ =~ /bar/) { 
    foo(); 
} 

には、これは私が先に述べた行方不明の引数を持つものとして、関数呼び出しと比較演算子と、第1の例を考える場合には、直感的な意味があります。

あなたのケースでは、$_変数の値が問題の正規表現と一致する場合、コードが何をしているのかがいくつかの変数の値を返しています。

+1

***隠し変数***が間違っています。 '$ _'などは、***特殊変数***または***事前定義変数***と呼ばれます。 – Borodin

+0

これは「デフォルト変数」と呼ばれています。 "隠し変数"はそのための良い名前です、私はそれを使い始めます。 – Schwern

1
return $equa if /\@BOUNDARY/; 

ので

if (/\@BOUNDARY/) { 
    return $equa; 
} 

又は

if ($_ =~ /\@BOUNDARY/) { 
    return $equa; 
} 
ifステートメントの結果に if文修飾子から変換

return $equa if $_ =~ /\@BOUNDARY/; 

ための短いです

しかし、現在のコードはバグが多い可能性が高いです。 ``ますreturn $ equa場合と同じであり、それは/

return $equa if $equa =~ /\@BOUNDARY/; 

が、それはBOUNDARY @

if ($equa =~ /\@BOUNDARY/) { 
    return $equa; 
} 
関連する問題