2012-08-03 5 views
7

他のものと同じように(引用符なし)というシンボルがあるように見えます。のように見えます。のように扱えます。例えば、'_</usr/perl/lib/Carp.pm'です。ソースへのハンドルを取得できますか?

これを使用する方法はありますか?

入力ソースを読みたい場合は、ソースフィルタを使用する必要がありますか?


私はデバッグがオンになっている場所がわかりません。ベーステーブルをダンプした後、%INCのダンプが表示されます:

$VAR1 = { 
     'warnings/register.pm' => 'C:/strawberry/perl/lib/warnings/register.pm', 
     'XSLoader.pm' => 'C:/strawberry/perl/lib/XSLoader.pm', 
     'English.pm' => 'C:/strawberry/perl/lib/English.pm', 
     'Tie/Hash/NamedCapture.pm' => 'C:/strawberry/perl/lib/Tie/Hash/NamedCapture.pm', 
     'unicore/lib/Perl/_PerlIDS.pl' => 'C:/strawberry/perl/lib/unicore/lib/Perl/_PerlIDS.pl', 
     'unicore/Heavy.pl' => 'C:/strawberry/perl/lib/unicore/Heavy.pl', 
     'warnings.pm' => 'C:/strawberry/perl/lib/warnings.pm', 
     'utf8.pm' => 'C:/strawberry/perl/lib/utf8.pm', 
     'Config.pm' => 'C:/strawberry/perl/lib/Config.pm', 
     'overloading.pm' => 'C:/strawberry/perl/lib/overloading.pm', 
     'Symbol.pm' => 'C:/strawberry/perl/lib/Symbol.pm', 
     'Carp.pm' => 'C:/strawberry/perl/lib/Carp.pm', 
     'bytes.pm' => 'C:/strawberry/perl/lib/bytes.pm', 
     'Exporter/Heavy.pm' => 'C:/strawberry/perl/lib/Exporter/Heavy.pm', 
     'utf8_heavy.pl' => 'C:/strawberry/perl/lib/utf8_heavy.pl', 
     'strict.pm' => 'C:/strawberry/perl/lib/strict.pm', 
     'Exporter.pm' => 'C:/strawberry/perl/lib/Exporter.pm', 
     'vars.pm' => 'C:/strawberry/perl/lib/vars.pm', 
     'constant.pm' => 'C:/strawberry/perl/lib/constant.pm', 
     'Errno.pm' => 'C:/strawberry/perl/lib/Errno.pm', 
     'overload.pm' => 'C:/strawberry/perl/lib/overload.pm', 
     'Data/Dumper.pm' => 'C:/strawberry/perl/lib/Data/Dumper.pm' 
    }; 
+0

ソースファイルに '__DATA__'セグメントがあるかどうかにかかわらず、ソースフィルタなしでソースファイルを読み込む方法を示すために私の答えを更新しました。 – DavidO

+0

ありがとう、@DavidO。コンパイル時の動作をテストします。 – Axeman

+0

私が提供した解決策があなたのために働いたかどうかを確認するために、数日後にちょうどフォローしてください。 – DavidO

答えて

2

入力ソースを読みたい場合は、ソースフィルタを使用する必要がありますか?

ソースファイルが__END__または__DATA__タグを持っている場合は、DATAファイルハンドルが利用可能です。 ...それ自体は退屈だ。面白いのは、あなたが0をseek配置することができ、そしてそれは、ソースファイルの先頭に表示されますということです。

use Carp; 

print "Just another Perl hacker,\n"; 

eval { 
    no warnings qw/unopened/; 
    seek DATA, 0, 0 
     or croak "Script lacking __END__ or __DATA__ tag has no DATA filehandle."; 
}; 
if([email protected]) { 
    while(<DATA>){ 
     print; 
    } 
} 
else { 
    carp [email protected]; 
} 

__END__ 

このスクリプトは、(印刷「ちょうど別のPerlハッカーを、」)を実行し、その後終了しますそれ自身のソースを印刷して

上記のコードでは、evalブロックが例外をトラップする場合、代替はFindBinと$0を使用してソースファイルを開いて読み込むことです。まとめると、それがどのように見えるかです:

BEGIN { 
    use Carp; 

    sub read_source { 
     my $source; 
     local $/ = undef; 
     eval { 
      no warnings qw(unopened); 
      my $DATA_position = tell DATA; 
      croak "'tell DATA' failed: Probably no __END__ or __DATA__ segment." 
       if $DATA_position < 0; 
      seek DATA, 0, 0 
       or croak 
       "'seek DATA' failed: Probably no __END__ or __DATA__ segment."; 
      $source = <DATA>; 
      seek DATA, $DATA_position, 0 or croak # Must leave *DATA usable. 
       "seek to reset DATA filehandle failed after read."; 
     }; 
     if ([email protected]) { 
      croak [email protected] if [email protected] =~ /reset/; # Unstable state: Shouldn't be possible. 
      eval { 
       require FindBin; 
       no warnings 'once'; 
       open my $source_fh, $FindBin::Bin . '/' . $0 or croak $!; 
       $source = <$source_fh>; 
      }; 
      croak "Couldn't read source file from *DATA or \$0: [email protected]" if [email protected]; 
     } 
     return $source; 
    } 
}; 

print read_source(), "\n"; 

このコードは、最初FindBinをロードして、新しいファイルハンドルをオープンする必要性を排除する、DATAから読み取ろうとします。それが失敗すると、FindBinのアプローチが試されます。どちらも失敗すると、例外がスローされます。最後の正常な状態では、ソースファイル全体が$source_codeにスローされます。DATAハンドルも、このスニペットを呼び出す前の状態に復元されます。

これは、ソースフィルタを使用せずにソースファイルを読み込む方法の問題を確実に処理する必要があります。

2

これはperlデバッガで表示されますか?これはシンボル表のエントリがどこから来たのかと思われます。DATA STRUCTURES MAINTAINED BY CORE section of the perldoc in your perl5db.pl fileを参照してください。私はシンボルテーブルに_<-エントリを取得するために見ることができる唯一の方法は、例えば、ちょうど-dスイッチでPerlを開始し、標準入力にPerlプログラムを入力することです

$ perl -d 

Loading DB routines from perl5db.pl version 1.32 
Editor support available. 

Enter h or `h h' for help, or `man perldebug' for more help. 

print "Hello world\n"; 
<Ctrl-D> 
main::(-:1): print "Hello world\n"; 
    DB<1> 

ここから、 @{"_<-"}(または@{$main::{"_<-"}})があなたの入力が含まれ、${"_<-"}または${$main::{"_<-"}}はあなたのファイルの「名前」(ちょうど-)を含み、%{"_<-"}/%{$main::{"_<-"}}標準入力からコードをステップ実行のためのブレークポイントとアクションに関する情報を保持しています。 strict refsなし

、あなたも_<-(または任意の他の_<...のシンボルのための)のシンボルテーブルエントリに関連付けられているファイルハンドルがありません

DB<6> $name="_<-" 

    DB<7> p ${$name} 
- 
    DB<8> p @{$name} 
BEGIN { require 'perl5db.pl' }; 
print "Hello world\n"; 

    DB<9> p %{$name} 

ようなもので、このデータを表示することができます。

+0

ああ、ファイルの先頭を探しているのは面白いです。これはコンパイル段階では全くできますか? – Axeman

関連する問題