興味深いPerl開発者エラー

コードがあるとします:
chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  1. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  2. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  3. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  4. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  5. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  6. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  7. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  8. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  9. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  10. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  11. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  12. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  13. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  14. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  15. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  16. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  17. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  18. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  19. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  20. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
  21. chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .
chomp(my $input = <STDIN>); my $kinda_secret = get_data($input); if (defined $kinda_secret) { print 'Your secret is: ' , $kinda_secret } else { print 'No soup for you' } sub get_data { my $input = shift; open my $fh, '<' , 'data.file' or return ; my $retval; while (<$fh>) { if (/^$input:(.+?)$/) { $retval = $1; last } } close $fh; $retval } * This source code was highlighted with Source Code Highlighter .

エキゾチックなものは何もありません。 このコードのバリエーションはどこでも発生します。 コードの意味が明確であることを願っています(その実用的な価値を意味するものではありません)。

すでにエラーを見ましたか? もしそうなら、あなたはそれ以上読むことができません。

そして、私は、率直に言って、何が起こっているのかをすぐには理解しませんでした(明確な例を示します:

 ksurent @ desktop:〜> cat data.file 
 password1:hello1
 password2:hello2
 ksurent @ desktop:〜> perl -l t.pl
パスワード1
あなたの秘密は:hello1
 ksurent @ desktop:〜> perl -l t.pl
パスワード
スープなし
 ksurent @ desktop:〜> perl -l t.pl
 。+
あなたの秘密は:hello1
 ksurent @ desktop:〜> 


もちろん、あなたはすでに最後の試みに気付いています。 そして、彼らは何が起こったのかを認識しました-データ開示につながる正規表現の導入。 エラーは興味深いほどまれです。
実際には、正規表現内の変数はデフォルトで解釈されます。 このため、常に一致する式を導入できます。

もちろん安全な方法があります:メタキャラクター\ Qと\E。 \ Qは、\ Eまでのメタ文字の解釈を無効にします(\ Eが省略されている場合は正規表現の最後まで)。
通常の変数に置き換える場合、\ Q \ Eに未検証のデータを含む変数をフレーム化するルールを作成します。

小さな追加


非常にエキゾチックなパフォーマンス条件のため、実用的な価値はありません。 ただ面白い。
なんらかの理由で行がスクリプトに含まれていることが判明したと想像してください
  re 'eval'を使用します。 
。 たとえば、どこかで複雑な動的レギュラーが使用されていることはわかりません。 これにより、コードの実装が行われます。
 ksurent @ desktop:〜> perl -l t.pl
 (?? {system'id '})
 uid = 1000(ksurent)gid = 100(ユーザー)グループ= 16(ダイヤルアウト)、33(ビデオ)、100(ユーザー)
 uid = 1000(ksurent)gid = 100(ユーザー)グループ= 16(ダイヤルアウト)、33(ビデオ)、100(ユーザー)
スープなし
 ksurent @ desktop:〜>

これらは物です。 幸いなことに、インタプリタ開発者はこれを予見しました:デフォルトでは、そのようなことは転がりません。 しかし! たとえ
  re 'eval'を使用します。 
スクリプトはないので、開発者の手に渡らない小さなコードを入手できます。

 ksurent @ desktop:〜> perl -l t.pl
 (?? {system'id '})
実行時に評価グループを使用できません。正規表現でre 'eval'を使用しますm / ^(?? {system'id '}):(。+?)$ / t.pl行15、<$ fh>行1
 ksurent @ desktop:〜>

Source: https://habr.com/ru/post/J67143/


All Articles