Discipulus has asked for the wisdom of the Perl Monks concerning the following question:


hello to all
I have discovered the hesoteric use of the .. operator and decided to write a quick and dirty tag dumper. i like the result but I think the oneliner resulting can be improved.. by you.
I first tried with the -l and -p switches but i was unable to shift away the two argoument required for the search.

perl -e "map {print qq!\n$_\n\n!;open F,$_; while(<F>) {print qq!$.: +$_! if $_ =~/\[$ARGV[0]\]/ .. /\[\/$ARGV[0]\]/}close F; } glob +($ARGV[1])" tath_tag ./*/dir/*.ext
thanks for the attention
PS: i know there are modules to do that and in a clever way.
L*
there are no rules, there are no thumbs..

Replies are listed 'Best First'.
Re: seeking oneliner improvement
by BrowserUk (Patriarch) on Nov 25, 2011 at 14:51 UTC

    Hard to test locally, but this should be (roughly) equivalent

    perl -s -e"BEGIN{@ARGV=glob@ARGV}" -nle"/\[$TAG\]/../\[\/$TAG\]/&& print qq[$ARGV($.):$_]" -TAG=tath_tag ./*/dir/*.ext

    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

      Probably better as:

      perl -sne " BEGIN { @ARGV = map glob( $_ ), @ARGV } /\[$TAG\]/ ... /\[ +\/$TAG\]/ && print qq[$ARGV($.):$_]; close ARGV if eof " -- -TAG=ta +th_tag ./*/dir/*.ext

      1. glob works on strings, not arrays.
      2. If /\[$TAG\]/ and /\[\/$TAG\]/ are on the same line then .. will not work correctly.
      3. To get the correct line number for each file you need to close the filehandle at eof.
      4. And, without the -- switch the perl interpreter will try to parse -TAG as a valid perl option.


      thanks. if you replace
      /\[$ARGV[0]\]/ .. /\[\/$ARGV[0]\]/
      whith
      /\<$ARGV[0]\>/ .. /\<\/$ARGV[0]\>/
      and you glob a path with some html file it must search for some html tag you specifies.
      Really I don't understand your reply, sure for my ignorance: i go to study the -s operator
      thanks L*
      there are no rules, there are no thumbs..
        Really I don't understand your reply, sure for my ignorance: i go to study the -s operator

        See perlrun for -s. It cause perl to parse command line arguments of the form: -XYZ=pqr which causes the variable $xyz to have the value "pqr" within the program or one-liner.

        ## run perl; enable arg parsing perl -s ## expand filename globs -e"BEGIN{@ARGV=glob@ARGV}" ## if between the tags, print filename(linenumber):line -nle"/\[$TAG\]/../\[\/$TAG\]/&& print qq[$ARGV($.):$_]" ## Supply the tagname to search for; and the fileglob -TAG=tath_tag ./*/dir/*.ext

        (Obviously, you'll need to put that all on one line to run it.)


        With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.
Re: seeking oneliner improvement
by TJPride (Pilgrim) on Nov 25, 2011 at 16:25 UTC
    Ick. I could never understand people's need to put something that complicated into one line of incomprehensible code. Why not write a few lines of clean code into a script and then run the script? Are you doing this just to see if you can, or because you actually think this approach is a good idea?