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.

7
  • What does perl(Foo::Bar) mean? Is that a Perl package?
    – Ken Kinder
    Feb 29, 2012 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. Feb 29, 2012 at 23:14
  • @Ken: yes it is. Mar 1, 2012 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. Aug 16, 2013 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 & Linux.
    – edwin
    Aug 16, 2013 at 21:25

1 Answer 1

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).

2
  • 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. Aug 16, 2013 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, 2013 at 23:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.