1

Komodo Edit で ActiveState perl を使用しています。次のエラーが表示されます。

@INC で MyGengo.pm が見つかりません (@INC には C:/Perl/site/lib C:/Perl/lib が含まれます)。
D:\oDesk\MyGengo Integration\sample 行 6.

通訳者が のC:/Perl/lib代わりに中を見ているのはなぜC:\Perl\libですか? それが Linux ではなく Windows であることを知らないのですか?

編集

.pmファイルをディレクトリにコピーすることで問題を解決しましたC:\Perl\lib。このモジュールが手動でダウンロードされたため、問題が発生したと思います。PPM インストールは、.pmファイルをlibディレクトリにコピーします。

4

1 に答える 1

4

Windowsに関する限り、C:/Perl/lib同じC:\Perl\libディレクトリです。

perlportのドキュメントノート (強調を追加)

DOS と派生物

Perl は長い間、PC-DOS、MS-DOS、OS/2 などのシステムで動作する Intel スタイルのマイクロコンピュータ、および言及できるほとんどの Windows プラットフォーム (Windows CE を除く) に移植されてきました。COMMAND.COMシェルやシェルのスタイルに精通しているユーザーCMD.EXEは、これらのファイル仕様のそれぞれに微妙な違いがあることに注意してください。

my $filespec0 = "c:/foo/bar/file.txt";
my $filespec1 = "c:\\foo\\bar\\file.txt";
my $filespec2 = 'c:\foo\bar\file.txt';
my $filespec3 = 'c:\\foo\\bar\\file.txt';

システム コールは、またはのいずれ/\をパス セパレータとして受け入れます。ただし、DOS ヴィンテージの多くのコマンドライン ユーティリティは/オプション プレフィックスとして扱われるため、/ を含むファイル名と混同される可能性があります。外部プログラムを呼び出す/ことは別として、一般的な使用法とより一貫性があり、何をバックワックし、何をバックワックしないかを覚える問題を回避するため、問題なく動作し、おそらくより良く動作します。

あなたのコメントは、あなたがmygengo-perl-newを使用していることを示していますが、それは にインストールされていC:\Perl\lib\MyGengo\mygengo-api\nheinric-mygengo-perl-new-ce194df\mygengoます。これは、モジュールをインストールする通常とは異なる場所です。モジュールの記述方法では、 でmygengo.pm指定されたディレクトリの 1 つにあると想定され@INCます。クライアントコードはそれを

use mygengo;

私の提案は から に移動mygengo.pmするC:\Perl\lib\MyGengo\mygengo-api\nheinric-mygengo-perl-new-ce194df\mygengoことC:\Perl\site\libです。

開発中の別のパッケージの一部として mygengo を使用している場合の代替手段として、mygengoソース ツリーに、おそらくgit submoduleとしてドロップできます。use lib 'mygengo';このようにする場合は、追加することを忘れないでください。

完全な詳細については、 perlfunc ドキュメントの@INC検索プロセスrequireと、 を介したモジュールの追加のセマンティクスをuse参照してください。

スラッシュとバックスラッシュに関する一般的なアドバイス

コードが Windows でのみ実行される場合でも、ハードコードされたパスの区切り文字としてスラッシュを使用することをお勧めします。バックスラッシュは Perl 言語のエスケープ文字なので、もっと慎重に考える必要があります。二重引用符で囲まれた文字列では、通常の意味を得るためにエスケープ文字をエスケープすることを忘れないでください

# my $dir = "C:\Perl\lib";  # oops, $path would be 'C:Perlib'

$dir = "C:\\Perl\\lib";

単一引用符で囲まれた文字列内では、状況が少し良くなる可能性があります。$dirのように設定

$dir = 'C:\Perl\lib';

期待どおりに動作します$dirが、末尾にスラッシュが必要だとします。

$dir = 'C:\Perl\lib\';

これで、構文エラーが発生しました。

先頭行 n の EOF より前のどこにも文字列ターミネータ "'" が見つかりません。

別の値を に補間したい場合があります$dir

$dir = 'C:\Perl\lib\$module';  # nope

そうそう、補間には二重引用符が必要です。

$dir = "C:\Perl\lib\$module";  # still not right

ヘッドスクラッチとデバッグ後

$dir = "C:\\Perl\\lib\\$module";  # finally

したがって、バックスラッシュは間違いが発生しやすく、メンテナンスを刺激します。スラッシュは、単一引用符と二重引用符で囲まれた文字列内の通常の文字であるため、ほとんどの場合、期待どおりの意味を持ちます。

perlportが指摘しているように、Windows コマンド シェルはスラッシュをオプションの導入として扱い、バックスラッシュをパス セパレータとして扱います。シェルを避けられない場合は、バックスラッシュの処理を余儀なくされることがあります。

于 2012-05-26T11:25:59.453 に答える