4

This is certainly related to this question, but I feel it doesn't overlap, so here we go. How can I get the functionality of the following command on Ubuntu (and/or Debian as bonus):

yum whatprovides 'perl(Foo::Bar)'

Obviously I can attempt to rely on the package somehow ending up in a folder structure that resembles the namespaces in Perl, but I'm looking for something equivalent, i.e. equally brief and trivial. However, if it doesn't work as briefly on Ubuntu, I can do with a longer path and create my own function.

Please consider 10.04 or newer for this question.

0xC0000022L
  • 5,656
  • 6
  • 52
  • 91
  • What does `perl(Foo::Bar)` mean? Is that a Perl package? – Ken Kinder Feb 29 '12 at 20:46
  • I'm going with yes...it's a perl module. He's trying to find out what apt package provides a particular perl module. – RobotHumans Feb 29 '12 at 23:14
  • @Ken: yes it is. – 0xC0000022L Mar 01 '12 at 17:09
  • @maggotbrain: I'd love if it was, because then the question would be answered. Unfortunately the example in the other question is an entirely **different subset** of the `yum` functionality and has nothing whatsoever to do with my question. Had I asked about something that provides a particular file by path, your assumption would be correct, though. Same for the linked SO-question - completely unrelated. – 0xC0000022L Aug 16 '13 at 21:03
  • 3
    Notice that `apt-file` specifies the package associated with the file, so it is a close answer. For example, if `Baz.pm` is provided by `baz-perl`, this package will appear on the output. I don't think there is an APT command for specifying a `perl` module in the way you want, though. Looks like a convenience too convenient. I think this question is better suited to [unix.se]. – edwin Aug 16 '13 at 21:25
  • @edwin: fair point. But it looks like (unlike `yum`) `apt-file` doesn't even allow/support wildcards. So aside from the problem to guess the names (not too difficult with Perl-only modules), I need to give a full path. But probably it's at least a workaround. Thanks! (i.e. `apt-file list '*/DBI/SQL/Nano.pm'` doesn't, but `apt-file list /usr/lib/perl5/DBI/SQL/Nano.pm` does give a result ... if you get my drift :)) – 0xC0000022L Aug 16 '13 at 22:56
  • Try with `apt-file search Nano.pm`. – edwin Aug 17 '13 at 00:19

1 Answers1

4

If you are looking to a similar apt/dpkg function, I don't know one, but you can use this:

dpkg -S $(cpan -D Net::Cmd | grep pm | awk -F '/' '{print $NF}')
perl-modules: /usr/share/perl/5.14.2/IPC/Cmd.pm
perl-modules: /usr/share/perl/5.14.2/Net/Cmd.pm

You can use cpan -D module to find basic information about a module:

cpan -D Net::Cmd
Going to read '/home/braiam/.cpan/Metadata'
  Database was generated on Fri, 16 Aug 2013 21:53:02 GMT
Net::Cmd
-------------------------------------------------------------------------
    For command based protocols (FTP, SMTP etc)
    S/SH/SHAY/libnet-1.23.tar.gz
    /usr/share/perl/5.14/Net/Cmd.pm
    Installed: 2.29
    CPAN:      2.30  Not up to date
    Graham Barr (GBARR)
    gbarr@pobox.com

Then parse the module path, in my case I was lazy, you can use whatever you like to do this:

cpan -D Net::Cmd | grep pm | awk -F '/' '{print $NF}'
Cmd.pm

Then use command substitution:

dpkg -S $(cpan -D Net::Cmd | grep pm | awk -F '/' '{print $NF}')
perl-modules: /usr/share/perl/5.14.2/IPC/Cmd.pm
perl-modules: /usr/share/perl/5.14.2/Net/Cmd.pm

Hope is useful to you. BTW, this requires cpan installed (which is in most of the defaults installations).

Braiam
  • 66,947
  • 30
  • 177
  • 264
  • That's pretty good, especially if I can combine it with `apt-file` (which I use on most of my Ubuntu boxes). Thanks and +1. Let me dig into this a bit more before accepting it. – 0xC0000022L Aug 16 '13 at 23:05
  • I changed the way it finds the name, so `dpkg -S` won't fail when CPAN reports different path than where it is actually installed. – Braiam Aug 16 '13 at 23:31