Kurulu CPAN modüllerinin bir listesini nasıl edinebilirim?


90

Denemekten başka

perldoc <module name>

Benim ilgimi çeken veya dosya sisteminden geçen ve dizinlere bakan herhangi bir CPAN modülü için ayrı ayrı hangi modülleri kurduğumuza dair hiçbir fikrim yok.

Takılan her CPAN modülünün büyük bir listesini almanın en kolay yolu nedir? Komut satırından veya başka şekilde.


Pmtools , özellikle düzenli ifadeleri kabul eden pminst kullanmanızı önerebilirim .
lukmdo

perl-pmtools sizin için iyi araçlardır.
jaseywang

Hangi modüllerin kurulu olduğunu veya hangi dağıtımların kurulu olduğunu bilmek ister misiniz?
Tim Bunce

4
Bulduğum cpan -lpencerelerde kendim için yararlı olduğu.
geçersiz

1
Bu yararlı olabilir:instmodsh
Ravi

Yanıtlar:


67

Bu, hızlı bir şekilde bulunabilen Perl SSS bölümünde yanıtlanır perldoc -q installed. Kısacası, her ikisinin de daha önce bu başlıkta ele alınan varyantlarının kullanılması ExtUtils::Installedveya kullanılması File::Findsöz konusudur.

Ayrıca "Sistemime hangi modüllerin kurulu olduğunu nasıl bulabilirim?" SSS girişini de bulabilirsiniz. perlfaq3'te. Perlfaq'a bakarak tüm SSS cevaplarının bir listesini görebilirsiniz.


36
Bu, OP'nin neredeyse yararsız olmasını istediğinden çok daha fazlasını verir.
Justin

2
cpan -l, çalıştırdığım dizinde özyinelemeli bir arama yapıyor. Geçmesine herhangi bir yolu var mı ExtUtils::Installedşantiye skip_cwdo komut satırından seçeneği?
Mark Reed

10
SSS kullanılmasını söylüyor cpan -lancak bu RHEL6'da çalışmıyor ve /usr/bin/cpan -lhatayı atıyor Unknown option: l.
Stefan Lasiewski

1
$ perldoc perllocal | grep Modülü $ perldoc perllocal | grep -E 'VERSION | Modül'
caot

düz metin çıktısı almak için perldoc -t perllocal kullanın, aksi takdirde katıştırılmış ctrl karakterleri nedeniyle grep çalışmayabilir
user333869

35
perldoc perllocal

Düzenleme: CPAN SSS bölümünde (küçük) daha fazla bilgi var


2
SSS bağlantısı için teşekkürler. Ne yazık ki kurulu olduğunu bildiğim tüm modüller geri dönmüyor. Date :: Calc orada görünmüyor bile.
David McLaughlin

26

perldoc -q installed

İşe cpan -lyarayacağını iddia ediyor , ancak benim için çalışmıyor. Diğer seçenek:

cpan -a

yüklü paketlerin güzel bir listesini çıkarır ve bunları bir dosyaya yazmanın güzel yan etkisine sahiptir.


2
Kayıt için cpan -lçalışır (veya CPAN v2.05 ile benim için yapar). cpan -agerçekten daha güzel.
William Turrell

23

Perldoc perllocal'ın yalnızca CPAN aracılığıyla kurulan modülleri rapor edeceğini belirtmek gerekir. Birisi modülleri manuel olarak yüklerse, onları bulamaz. Ayrıca, modülleri yükleyen birden fazla kişiniz varsa ve perllocal.pod kaynak denetimi altındaysa, insanlar çakışmaları yanlış bir şekilde çözebilir ve listeyi bozabilir (bu, örneğin işte burada olmuştur).

Maalesef çözüm @INC'de File :: Find veya benzeri bir şeyle yürüyor gibi görünüyor. Ancak, bu sadece modülleri bulmakla kalmaz, aynı zamanda bir dağıtımdaki ilgili modülleri de bulur. Örneğin, Test :: Harness'in gerçek dağıtım adına ek olarak TAP :: Harness ve TAP :: Parser'ı da bildirir (sürüm 3 veya üzeri olduğunu varsayarsak). Bunları potansiyel olarak dağıtım adlarıyla eşleştirebilir ve eşleşmeyen adları atabilirsiniz, ancak daha sonra yerel olarak oluşturulmuş ve yüklenmiş modülleri atıyor olabilirsiniz.

Brian d foy'un backpan indeksleme çalışmasının onu .pm dosyasında teslim edecek bir koda sahip olması gerektiğine ve dağıtımı anlamaya çalışacağına inanıyorum, ancak bu bile bazen başarısız oluyor çünkü bir pakette ne olması gerekmiyor (bkz. Devel :: Cover :: Inc bir örnek).


1
Bunun için BackPAN katalog silahlarını çıkarmam gerektiğini sanmıyorum. Test :: Prereq ile yaptığım gibi, 02 paketlerinde bulduğu dağıtıma göre onu daraltmak yeterli olabilir. Bu, modül dosyalarını listelemekten biraz daha zor ve katalog henüz bunu işlemeye yakın değil.
brian d foy

2
İlkel bir testten (etrafta belirlediğim bazı dizinlerde "make -n install" yapmak), MakeMaker tabanlı herhangi bir modülün "make install" adımı yerel olarak güncellenir. Doğrudan CPAN aracılığıyla yüklemeye özgü değildir.
rjray

1
Bence Dist :: Surveyor, " bu kitaplıkta hangi dağıtımlar yüklü?" Sorusunu yanıtlamak için hala en iyi araç . Daha fazla ayrıntı için bu sunuma bakın. Git deposunda kullanımı kolay bir fatpack sürümü var .
Tim Bunce

20
$ for M in `perldoc -t perllocal|grep Module |sed -e 's/^.*" //'`; do V=`perldoc -t perllocal|awk "/$M/{y=1;next}y" |grep VERSION |head -n 1`; printf "%30s %s\n" "$M" "$V"; done |sort
              Class::Inspector     *   "VERSION: 1.28"
                    Crypt::CBC     *   "VERSION: 2.33"
               Crypt::Rijndael     *   "VERSION: 1.11"
                    Data::Dump     *   "VERSION: 1.22"
                   DBD::Oracle     *   "VERSION: 1.68"
                           DBI     *   "VERSION: 1.630"
                   Digest::SHA     *   "VERSION: 5.92"
           ExtUtils::MakeMaker     *   "VERSION: 6.84"
                       install     *   "VERSION: 6.84"
               IO::SessionData     *   "VERSION: 1.03"
               IO::Socket::SSL     *   "VERSION: 2.016"
                          JSON     *   "VERSION: 2.90"
                  MIME::Base64     *   "VERSION: 3.14"
                  MIME::Base64     *   "VERSION: 3.14"
                   Mozilla::CA     *   "VERSION: 20141217"
                   Net::SSLeay     *   "VERSION: 1.68"
                        parent     *   "VERSION: 0.228"
                  REST::Client     *   "VERSION: 271"
                    SOAP::Lite     *   "VERSION: 1.08"
                  Task::Weaken     *   "VERSION: 1.04"
                 Term::ReadKey     *   "VERSION: 2.31"
                Test::Manifest     *   "VERSION: 1.23"
                  Test::Simple     *   "VERSION: 1.001002"
                  Text::CSV_XS     *   "VERSION: 1.16"
                     Try::Tiny     *   "VERSION: 0.22"
                   XML::LibXML     *   "VERSION: 2.0108"
         XML::NamespaceSupport     *   "VERSION: 1.11"
                XML::SAX::Base     *   "VERSION: 1.08"

2
bu, cpan kurulu olmayanlarımız için iyi çalışıyor.
pdwalker

Gerçekten küçümsenen cevap. Bu aynı zamanda RHEL dağıtımları için de geçerlidir.
Cristina

5
Elimde:No documentation found for "perllocal".
Luis A. Florit

Çalışması beklediğimden daha uzun sürdü (makinemde yaklaşık 20 saniye kadar), ancak kusursuz bir şekilde çalıştı! Mükemmel cevap.
Hans Goldman

19

ExtUtils-Installed'ı deneyebilirsiniz , ancak bu yalnızca .packlists'ye bakar , bu nedenle insanların nesneleri @INCelle taşıdığı modülleri gözden kaçırabilir .

Bunu kabuk olmayan bir web barındırma hesabında bir CGI komut dosyası olarak yapmak isteyen bir arkadaşım için App-Module-Lister yazdım . Basitçe modül dosyasını alıp sunucunuzun bir CGI betiği olarak ele alacağı bir dosya adı olarak yükleyin. Standart Kitaplık dışında hiçbir bağımlılığı yoktur. Olduğu gibi kullanın veya kodu çalın.

Modüllerin ve sürümlerinin bir listesini çıkarır:

Kravat :: 1.15 Döngü
Kravat :: IxHash 1.21
Kravat :: 1.07'yi aç / kapat
Beraberlik :: ToObject 0.03
Zaman :: CTime 99.062201
Zaman :: DaysInMonth 99.1117
Zaman :: Dönem 0.02
Zaman :: Bulanık 0.34
Zaman :: JulianDay 2003.1125
Zaman :: ParseDate 2006.0814
Zaman :: Zaman Dilimi 2006.0814

Bunu bir özellik olarak eklemeyi düşünüyordum. cpan araca , bu yüzden bunu da yapacağım. [Zaman geçer] Ve şimdi bir -lgeçiş yapıyorum cpan. Yayınlamadan önce onunla yapmam gereken birkaç şey var, ama bu github'da . Bunu beklemek istemiyorsanız -a, listeye biraz Kapsül koysa da, anahtarı bir otomatik paket oluşturmak için deneyebilirsiniz.

İyi şanslar;


13

İşte hile yapacak bir betik:

use ExtUtils::Installed;

my $inst = ExtUtils::Installed->new();
my @modules = $inst->modules();
foreach $module (@modules){
       print $module ." - ". $inst->version($module). "\n";
}

=head1 ABOUT

This scripts lists installed cpan modules using the ExtUtils modules

=head1 FORMAT

Prints each module in the following format
<name> - <version>

=cut

RHEL 6.9 altında, bu komut dosyaları yalnızca aşağıdakileri yazdırır: Perl - 5.10.1 Modüller listelenmemiştir.
Hans Deragon

9

Bunun için CPAN 'r' komutunu kullanmayı seviyorum. CPAN kabuğuna eski stille girebilirsiniz:

sudo perl -MCPAN -e shell

veya yeni sistemlerin çoğunda bir 'cpan' komutu vardır, bu nedenle bu komut sizi kabuğa götürecektir:

sudo cpan

(Genellikle, root olarak çalıştırmak için 'sudo' kullanmanız veya çalıştırmadan önce root olmak için 'su -' kullanmanız gerekir; cpan'ı normal bir kullanıcı olarak çalıştırmanıza izin verecek şekilde ayarlamadıysanız, ancak root olarak kurmadıysanız. Bu makinede root yoksa, bu bilgiyi bulmak için CPAN kabuğunu kullanmaya devam edebilirsiniz, ancak modülleri yükleyemezsiniz ve ilk kez kurulumdan biraz geçmeniz gerekebilir. çalıştırın.)

Ardından, cpan kabuğuna girdikten sonra, kurulu tüm modülleri ve bunların sürümlerini bildirmek için 'r' komutunu kullanabilirsiniz. Bu nedenle, "cpan>" komut istemine 'r' yazın. Bu, kurulu tüm modülleri ve bunların sürümlerini listeleyecektir. "?" biraz daha yardım almak için.


1
aslında 'r' size yeniden yükleme önerileri verir - yani, kurulumunuzdaki daha yeni bir CPAN sürümüne sahip tüm modüller. Yüklemeniz çok eski olmadığı sürece bu tam bir liste olmayacaktır.
EvdB

Zorunlu olarak yükselttiğim için 'r' her zaman sıfırın yanında raporlar. Bu bana hatırlatıyor ... Bugün yükseltme yapmadım.
skiphoppy

3
-R öğeleri yeniden derler. Bir liste almak için, -a'yı deneyin veya en son kaynakları indirin ve sadece bu cevap için eklenen yeni -l anahtarıyla oynayın. :)
brian d foy

1
Neden sudoburası? Tamamen gereksiz.
Aristotle Pagaltzis

2
'cpan' için '-r' komut satırı bağımsız değişkeni ile
cpan

7

İşte bunu * nix'te yapmanın gerçekten hileli bir yolu, gerçekten umursamadığınız bazı şeyler alacaksınız (örn: uyarılar :: kayıt vb.), Ancak size şu adresten erişilebilen her .pm dosyasının bir listesini vermelidir. perl.


for my $path (@INC) {
    my @list = `ls -R $path/**/*.pm`;
    for (@list) {
        s/$path\///g;
        s/\//::/g;
        s/\.pm$//g;
        print;
    }
}


2
Bu ona istediğini vermeyecek. İlgili dosyaları parçası oldukları dağıtıma göre gruplamaz ve Perl'in kendisindeki tüm çekirdek * .pm dosyalarını listeler.
rjray

7
perl -MFile::Find=find -MFile::Spec::Functions -Tlwe 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC'

Bu, her bir *.pmmodülün tam yolunu açıkça gösterdiği için çok iyidir . Birçok kopya görebilirsiniz ...
not2qubit

7

instmodshTerminalinizdeki komutu kullanarak sisteminizde kurulu olan perl modüllerinin listesini alabilirsiniz. Çıktısını geliştirmek için size üç seçenek soracaktır:

   l            - List all installed modules
   m <module>   - Select a module
   q            - Quit the program

6

Linux / Unix'te şu basit komutu kullanıyorum:

perl -e 'print qx/find $_ -name "*.pm"/ foreach ( @INC );' 

Tüm klasörleri tarar @INCve herhangi bir * .pm dosyasını arar.


Teşekkür ederim! Çok kullanışlı.
not2qubit

Teşekkür ederim! Bu kadar kısa ve öz bir ifadeyle bana öğretilen belki de en büyük sorun budur.
2020




2

Perldoc veya diğer modülleri kuramayan ve hangi modüllerin (CPAN veya başka türlü) mevcut olduğunu bilmek isteyenler, linux ve Mingw32 / 64 için aşağıdaki işler:

grep -RhIP '^package [A-Z][\w:]+;' `perl -e 'print join " ",@INC'` | sed 's/package //' | sort | uniq

Evet, dağınık. Evet, muhtemelen istediğinizden daha fazlasını rapor ediyor. Ancak bir dosyaya aktarırsanız, hangi dbm arayüzlerinin mevcut olduğunu kolayca kontrol edebilirsiniz:

 grep -RhIP '^package [A-Z][\w:]+;' `perl -e 'print join " ",@INC'` | sed 's/package //' | sort | uniq > modules-installed
 cat modules-installed | grep -i dbm 

AnyDBM_File;
Memoize::AnyDBM_File;
Memoize::NDBM_File;
Memoize::SDBM_File;
WWW::RobotRules::AnyDBM_File;

Bu yüzden bu sayfaya geldim (hayal kırıklığına uğradım)

(Bunun OP'nin sorusuna tam olarak cevap vermediğini fark ettim, ama benim yaptığımla aynı sebepten dolayı buraya gelenler için gönderiyorum. Yığınla ilgili sorun bu *** sormak, var olduğunda bile, ancak yığın *** neredeyse her zaman Google'ın en çok hitidir!)


Bu benim için çalıştı. Bunu gönderdiğiniz için teşekkürler. Buna, herhangi bir bağımlılığı kurmak / güncellemek için fazla erişimim olmayan bir ortamda ihtiyacım vardı.
Ashish Kumar

1

Tam olarak bunu yapmak için daha dün bir perl betiği yazdım. Betik, ayırıcı olarak '::' kullanarak @INC'ye yüklenmiş perl modüllerinin listesini döndürür. Komut dosyasını kullanarak arayın -

perl perlmod.pl

VEYA

perl perlmod.pl <module name> #Case-insensitive(eg. perl perlmod.pl ftp)

Yazılım bağlantılarını yinelemekte sorun yaşadığım için komut dosyası şu anki dizini ('.') Atlıyor, ancak 17. satırdaki grep işlevini değiştirerek dahil edebilirsiniz.

  grep { $_ !~ '^\.$' } @INC

sadece,

@INC

Komut dosyası burada bulunabilir .



1

Ls (1) gibi harici bir program kullanmadan @INC dizin ağaçlarında dolaşmak için File::Find::Rule, güzel bir bildirime dayalı arayüze sahip olan modül kullanılabilir .

Ayrıca, önceki Perl sürümlerinin aynı modülleri içermesi durumunda kopyaları filtrelemek istiyorsunuz. Bunu yapacak kod şuna benzer:

#! /usr/bin/perl -l

use strict;
use warnings;
use File::Find::Rule;

my %seen;
for my $path (@INC) {
    for my $file (File::Find::Rule->name('*.pm')->in($path)) {
        my $module = substr($file, length($path)+1);
        $module =~ s/.pm$//;
        $module =~ s{[\\/]}{::}g;
        print $module unless $seen{$module}++;
    }
}

Çalıştırmanın sonunda, tüm modül adlarınızı% görülen karmasında anahtar olarak alırsınız. Kod, kanonik dosya adını ($ dosya olarak verilir) görülen zamanların sayısı yerine anahtarın değeri olarak kaydedecek şekilde uyarlanabilir.


1

Aşağıdakiler benim için çalıştı.

$ perldoc perllocal | grep Module
$ perldoc perllocal | grep -E 'VERSION|Module'

1

İşte @ JamesThomasMoon1979 tarafından tek satırlık olarak yeniden yazılmış bir senaryo

perl -MExtUtils::Installed -e '$i=ExtUtils::Installed->new(); 
      print "$_ ".$i->version($_)."\n" for $i->modules();'


0

İşte yüklü modüllerin bir listesini yazdıracak bir Perl tek satırlık:

perl -MExtUtils::Installed -MData::Dumper -e  'my ($inst) = ExtUtils::Installed->new(); print Dumper($inst->modules());'

Data :: Dumper'ın kurulu olduğundan emin olun.


2
Bu, 'cpan -l' listeleyen 5945 yerine sadece yaklaşık 15 perl modülünü listeler.
Paul Tomblin

0
cd /the/lib/dir/of/your/perl/installation
perldoc $(find . -name perllocal.pod)

Windows kullanıcıları bulmak için sadece bir Windows Gezgini araması yapar.


0

"Perldoc -l" yi deneyin:

$ perldoc -l Log :: Dispatch /usr/local/share/perl/5.26.1/Log/Dispatch.pm


-1

Perl betiğinizi girdiğinizde, kurulu tüm modülleri @INC'deki klasörlerin altında .pm dosyaları olarak görürsünüz, böylece küçük bir bash betiği sizin için işi yapacaktır:

#!/bin/bash

echo -e -n "Content-type: text/plain\n\n"

inc=`perl -e '$, = "\n"; print @INC;'`

for d in $inc
do
   find $d -name '*.pm'
done

Neden olmasın? find `perl -le'print for@INC'` -name '*.pm'
Hynek -Pichi- Vychodil

-2

Linux için almanın en kolay yolu,

dpkg -l | grep "perl"

1
OP sistemde kurulu CPAN (perl) modüllerinin bir listesini istedi, sistemde perl kurulu ise değil (OP de
apt'ın

Perl uzmanı değilim ama yukarıdaki komuttan perl modüllerinin kurulu olduğunu gördüm. Buradaki mükemmel cevap olmayabilir.
Yasiru G

@YasiruG yalnızca paketler aracılığıyla kurulanları listeler; bu herhangi bir kurulumda azınlıktır. Çoğu CPAN üzerinden kurulur.
jjmerelo

-2

Bu benim için çalışıyor

perl -e 'print join("\n",@INC,"")'

Sınırlı ve anında yardım sağlayabilecek bu kod parçacığı için teşekkür ederiz. Bir Doğru bir açıklama ölçüde uzun vadeli değer artıracak göstererek neden bu soruna iyi bir çözüm olduğunu ve diğer benzer sorularla gelecek okuyucularına daha kullanışlı bir hale getirecektir. Yaptığınız varsayımlar da dahil olmak üzere bazı açıklamalar eklemek için lütfen cevabınızı düzenleyin .
Machavity

-3

Yaptığım şey şu: perl -M{cpan_module}
Herhangi bir hata almazsanız, modülün kurulu olma şansı yüksektir.


2
Bunun soruyu yanıtladığına inanmıyorum. Bu öneriyi kullanarak, hangi modüllerin kurulu olup olmadığını anlamak için birisinin modül modül üzerinden geçmesi biraz zaman alabilir.
Dave Newman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.