Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer

Perldoc Keyword Search (update3)

by LanX (Cardinal)
on Feb 16, 2012 at 05:44 UTC ( #954149=CUFP: print w/replies, xml ) Need Help??

... or how to find X<>-refs in Pod and search them in pager


Did you ever try to find the documentation of the ".." (flip-flop) operator?

typing perldoc -f .. doesn't help ...

$ perldoc -f .. No documentation for perl function `..' found
But perldocs have tags like X<..> indicating the right documentation, only the formatters are missing.

Previous discussions

  • [perldoc] keyword search or
  • So whats new about pod and X<>-tag? How to check current development?


  • Grep core-Pods for X<TAGS>.

  • Insert marker in front of every hit.

  • Call pager (here less) with default search pattern to find those markers.


  • type pdoc qr to find all references for qr.

  • Typing n and N will jump from marker to marker.

  • After quitting a manpage qthe next is built and displayed

    Prove of concept

    Just a hack ("release often" dogma)

    Tested for linux.

    file "pdoc"
    #!/usr/bin/perl use strict; # use Data::Dump; my $poddir = `perldoc -l perltoc`; chomp $poddir; $poddir =~ s/perltoc/*/; my $pattern = $ARGV[0]; my @pods= grep {! /perltoc/} `grep -l -F 'X<$pattern>' $poddir`; chomp @pods; # dd @pods; for my $infile (@pods) { open my $in, "<", $infile; my $outfile = "/tmp/". (split "/",$infile)[-1]; open my $out,">", $outfile; local $/="\n\n"; my $marker = ">>> X<$pattern> <<<"; #"MARK"; while (my $para = <$in>){ print $out "\nC<<<< $marker >>>>\n\n" if $para =~ /X<\Q$pattern\E>/; print $out $para; } close $out; my $ret = `pod2man $outfile |nroff -man > /tmp/`; print system("less -p \"$marker\" /tmp/") }

    Cheers Rolf

  • Replies are listed 'Best First'.
    Re: Perldoc Keyword Search (update4)
    by LanX (Cardinal) on Apr 21, 2013 at 11:15 UTC
      Update 4

      For usage see Re: perl docs -- I am so sick of...

      cat /home/lanx/perl/bin/pd


      #!/usr/bin/perl use strict; use Data::Dump; my $pattern = $ARGV[0]; my $poddir = `perldoc -l perltoc`; chomp $poddir; $poddir =~ s/perltoc/*/; #print `grep -l3 -F 'X<$pattern>' $poddir`; # find pods excep +t perltoc my @pods= grep {! /perltoc/} `grep -l -F 'X<$pattern>' $poddir`; # find pods except perlto +c # rank pods with default=500 @pods = map { $_->[0] } sort { $a->[1] <=> $b->[1] } map { /faq/ ? [$_=> 700] : /delta/ ? [$_ => 900] : /var/ ? [$_ => 100 ] : /func/ ? [$_ => 200 ] : [$_ => 500] } @pods; if (not @pods) { print "No matches found\n"; } else { print "Matches for $pattern found in :\n @pods"; } chomp @pods; #dd @pods; for my $infile (@pods) { open my $in, "<", $infile; my $outfile = "/tmp/". (split "/",$infile)[-1]; open my $out,">", $outfile; my $marker = ">>> X<$pattern> <<<"; #"MARK"; my ($podname) = ( $infile =~ /\/(\w*)\.pod$/); local $/="\n\n"; # split paragraphs while (my $para = <$in>){ print $out "\nC<<<< $marker >>>> in $podname\n\n" # prepend + marker if $para =~ /X<\Q$pattern\E>/; print $out $para; } close $out; my $ret = `pod2man $outfile |nroff -man > /tmp/`; my $system = system( 'less -p \'' . shellescape($marker) . '\' /tmp/'); print $system if $system ne 0; } sub shellescape { my ($str) = @_; $str =~ s/\$/\\\$/; #print "$str\n"; return $str; }

      Cheers Rolf

      ( addicted to the Perl Programming Language)

    Log In?

    What's my password?
    Create A New User
    Node Status?
    node history
    Node Type: CUFP [id://954149]
    Approved by Corion
    Front-paged by Corion
    and the web crawler heard nothing...

    How do I use this? | Other CB clients
    Other Users?
    Others cooling their heels in the Monastery: (6)
    As of 2020-07-10 19:34 GMT
    Find Nodes?
      Voting Booth?

      No recent polls found