2010-08-22 25 views
12

Ben perl ayıklayıcıya içeride 'Modern perl' kod değerlendirmek kuramıyorum. Bir dosyada kodu ayıklarken, komut isteminden değil, tamam çalışıyor.Hata ayıklayıcı içinde perl 5.10 özellikleri nasıl kullanılır?

asgari örnek:

# activating 5-10 features with -E (it works) 
$ perl -E 'say "x"' 
x 
 
# calling the debugger with -E 
# it works for infile code but for prompt line code... 
$ perl -dEbug Loading DB routines from perl5db.pl version 1.33 
    DB say "x" 
    String found where operator expected at (eval 16)[/local-perl/lib/5.12.1/perl5db.pl:638] line 2, near "say "x"" 
    at (eval 16)[/local-perl/lib/5.12.1/perl5db.pl:638] line 2 
     eval '([email protected], $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop;say "x"; 

[not: aynı " ': 5.10' kullanım özelliğiyle" ile olur]

Ben bir şey eksik?

cevap

7

Bu ilginç bir soru ve hiç düşünmediğim bir soru, bu yüzden bu konuda kudos.

here numaralı soruna bir başvuru buldum, ancak yaklaşık bir yaşında. Ancak, perl kaynağının ilgili bölümü beri değişmedi ve here görülebilir. Eğer perl kaynağındaki toke.c bakmak eğer Esasen, aşağıdaki bakın: Temelde

if (PL_perldb) { 
    /* Generate a string of Perl code to load the debugger. 
    * If PERL5DB is set, it will return the contents of that, 
    * otherwise a compile-time require of perl5db.pl. */ 

    const char * const pdb = PerlEnv_getenv("PERL5DB"); 
      ... 
} 
... 
if (PL_minus_E) 
    sv_catpvs(PL_linestr, 
      "use feature ':5." STRINGIFY(PERL_VERSION) "';"); 

, ayıklayıcı -E bayrak işlenir önce yüklenmiştir, dolayısıyla özellikler henüz zaman etkin değil hata ayıklayıcı yüklenir. Bu özü şu anda -d komutuyla -E kullanamazsınız olmasıdır. Eğer say, switch veya ayıklama isteminden başka özelliği kullanmak istiyorsanız, böyle yapmak zorunda:

DB<1> use feature 'say'; say "x" 
    x 

Bir çözüme gördüğüm en yakın olan:

    farklı adla PERL5LIB ya yere PERL5LIB veya geçerli dizin gelen
  1. kopya perl5db.pl, myperl5db.pl
  2. Düzenleme myperl5db.pl kullanım özelliğine sahip söylemek ': 5.10'; (ya da sadece 'devlet' ya da sadece 'demek') ilk satırda.
  3. Ben PerlMonks bulunan

"{ 'myperl5db.pl' gerektiren} BEGIN" ile ortam değişkeni PERL5DB ayarlayın.

+0

Hummm, cevabınız için teşekkürler, bunun neden olduğunu açıklıyor. Ama artık daha şaşkın: Ben 'kullanım özelliği 'demek'' ve bu işe yaramadı ile ayıklayıcısında bu özellikleri yüklemeden önce çalıştık. Şimdi hileyi gördüm: Aynı çizgide olmalı. Niye ya??? Neden 'özellik' modülü mevcut kapsamı (DB hattı) için yerelleştirilmiş işlevleri verir? 'Kullanım' bunu nasıl yapabilir? Ancak bu her zaman küreseldi. Eğer lokalize bir şey istediyseniz 'gereksinim' kullanıyorsunuz değil mi? Bu konuda herhangi bir aydınlanma için minnettarım. –

+1

Bunun da olağandışı olduğunu düşündüm. Dürüst olmak gerekirse, "neden" bölümünde gerçekten emin değilim, ama kesinlikle doğru gibi görünüyorsun - 'x özelliği kullan' ifadeleri DB hattına dağıtılmış gibi davranıyor. Benim tahminim, her satırın farklı bir blok/kapsam olarak yürütülmesidir, çünkü $ x = 1 gibi bir değişkeni bildirmek sonraki satırlarda da "$ x" yapamaz. satır, sadece mevcut hat). (Feature' 'gibi) pragmas lexically bunları kullanmak hangi bloğun sonuna kapsamına eklenir, bu durum tutarlı olacaktır. – eldarerathis

+0

teşekkürler, 'feature' sözcük kapsamını kaçırdı. Bu, 'sadece satır eyleminde' açıklar. Ancak, modülümün veya komut dosyasının 'özellik özelliğini kullanmaya başladığında neden işe yaramadığını biliyor musunuz?Bu, tüm kullanım özelliklerinde gerçekleşeceği anlamına mı geliyor? Son olarak, eğer perl> 5.10 özelliklerini kullanıyorsanız, komut dosyasında, satırda bir hata olduğunda bunları nasıl ayıklarsınız ve hata ayıklayıcıda onunla oynamak istersiniz? Devel :: REPL'i onunla oynamak ister misiniz? –

İlgili konular