Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic

Cool Uses for Perl

( #1044=superdoc: print w/replies, xml ) Need Help??

This section is the place to post your general code offerings -- everything from one-liners to full-blown frameworks and apps.

Lexing C++
3 direct replies — Read more / Contribute
by Random_Walk
on Aug 31, 2019 at 19:17

    So folks,

    today I need to makes some sense of C++ files. I will need to parse out function signatures, and I have tried this with regex before, it gets messy especially around templates. Now a similar requirement has reared it's head so step one, lex the code. without further ado here is my attempt at lexing C++. The Lexer is called with an open file handle to a C++ source file. This is lexed into an array of tokens, that is then handed on to the parser.

    What do you think, is this going to give me a nice labeled stream and make parsing a dream, or am I stumbling into know gotchas? Does it qualify as cool?


    Pereant, qui ante nos nostra dixerunt!


    More compiler directives added (I know Kung Fu)
1 direct reply — Read more / Contribute
by Anonymous Monk
on Aug 30, 2019 at 05:25
    Saved as
    #!/usr/bin/perl my $h = "hello"; my $w = "world"; for (my $i = 0; $i < 3; $i++) { print "$h $w \n"; } my $n = 0; my $x = 100000000; for (my $i = 0; $i < $x; $i++) { $n++; } print "\n"; print "Counted to $n \n";
    perl < | tee hw.cpp && g++ hw.cpp -o hw.o && time pe +rl && time hw.o
    #include <iostream> int main(){ //!/usr/bin/perl std::string h("hello"); std::string w("world"); for (double i=0; i < 3; i++) { std::cout << "" << h << " " << w << " \n"; } double n=0; double x=100000000; for (double i=0; i < x; i++) { n++; } std::cout << "\n"; std::cout << "Counted to " << n << " \n"; return 0; }
    Observed discrepancy:
    perl	0m3.213s
    c++	0m0.298s
    Cool use for Perl, to learn a little C++!
Moving, copying and renaming files with new tool
2 direct replies — Read more / Contribute
by siberia-man
on Aug 14, 2019 at 05:22
    Hello Monks,

    I re-invented the wheel and decided to share it. This is script that is supposed to be used as a tool for moving, copying and renaming files. In the beginning I called it as "the re-invented wheel" becuase there are a few implementations for such kind of functionality. I found 3 of them at least (all are mentioned in the documentation). While developing the script I borrowed some good ideas from those implementations and adapted for my script. And I applied my vision of the conveniency.

    Here I show some scenarios from real life I've really met:

    Removing prefixes and suffixes:

    file-rename 's/^[^.]+\.//; s/\.[^.]+$//' ...
    Enumerate files:
    file-rename 's/^/sprintf "%02d. ", $NR/' ...

    By default the script implements move files, but it is possible to copy them with the option -c, --copy.

    It is posible to include/exclude Perl modules with the option -M for those cases it you need to apply something very specific. It is similar to Perl's own option.

    With the -T or --transcode option it is possible to apply encoding over names. For example the following example works fine for filenames in Cyrillic with Perl 5.14 under Cygwin 1.7.25:

    file-rename -Tutf8 '$_ = ucfirst' -f ...

    Handling with filename component is enabled with the option -N, --filename-only. The is example (prepending filenames with some prefix):

    file-rename 's/^/old-/' -N ../*

    Verbosity, forcing and dry-run are implemented with the -v, -f and -n options, respectively. The long options are also available

    I have still never met the case of using the zero-terminated lines but implemented it with the options -z, -0, --null.

    The last thing I developed is renaming in loop with the option -r, --rename. With this option we can:

    Rotate files cyclically to left (resulting to file2 file3 file4 file1):

    file-rename --rename=rotate-left file1 file2 file3 file4
    Rotate files cyclically to right (resulting to file4 file1 file2 file3):
    file-rename --rename=rotate-right file1 file2 file3 file4
    Swap pair of files (swap nearest, resulting to file2 file1 file4 file3):
    file-rename --rename=swap file1 file2 file3 file4
    Flip the whole list of files (swap farthest, resulting to file4 file3 file2 file1):
    file-rename --rename=flip file1 file2 file3 file4

    The script lives in github. Below is the latest version to the moment of the writing.

Animated Heatmap
3 direct replies — Read more / Contribute
by Anonymous Monk
on Aug 10, 2019 at 08:52
New stable MCE 1.842 and MCE::Shared 1.842 releases
No replies — Read more | Post response
by marioroy
on Jul 21, 2019 at 23:13

    Update: Added results for Parallel::ForkManager 2.02. The results mentioned in the POD documentation ran slower due to an unaware background job at the time. I reran again on all 5 platforms.

    Dear fellow Monks,

    I am pleased to annouce MCE 1.842 and MCE::Shared 1.842 (both stable). MCE now includes MCE::Channel and MCE::Child recently.

    This weekend, added Parallel::ForkManager-like demonstration to the POD section in MCE::Child and MCE::Hobo. The results were captured on a Macbook Pro (late 2013 model - 2.6 GHz ~ 3.6 GHz with Turbo Boost).

    To run, one may direct standard output to :nul or /dev/null depending on the platform. Or better yet, I commented out the print line in the on_finish handler. Unfortunately, Parallel::ForkManager 2.02 suffers from memory leaks on the Windows platform ($^O eq 'MSWin32') and the reason why slower than Cygwin.

    These days, there are other ways and instead have workers persist (i.e. pull items from a shared queue or channel) or perhaps via MCE's input and chunking capabilities.

    Regards, Mario

2d field of view, vision algorithm in grid (ray casting)
1 direct reply — Read more / Contribute
by Discipulus
on Jun 24, 2019 at 15:05
    Hello community!

    who knows me is aware I'm writing a game (engine?) and I asked here for the precious monks wisdom about circular area in a coordinates grid (AoA).

    But now I'm progressing and I discovererd that the above illuminate function is not enough. I found a big resource of Roguelike_Vision_Algorithms and I choosed the simplest one (second example) and I ported it to Perl ( field_of_view sub in the below code ).

    Impressed by this shiny exemple I wrapped into an interactive program to show my proof of concept:

    Chatting in the perl irc channel daxim also implemented a semi-transparency feature I'd like to add to my game. Here daxim's patch (and a big thank to him):

    have fun!


    There are no rules, there are no thumbs..
    Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.
Listener Crossword #4321 solitaire
No replies — Read more | Post response
by GrandFather
on Jun 21, 2019 at 06:19

    The Times newspaper features an occasional "The Listener Crossword" which is in fact a numerically based logic puzzle in the form of a crossword. A friend of mine introduced me to the genera with #4321 which is a puzzle of two parts. The first part consists of populating the playing grid with hexadecimal numbers. The second part consist of using the populated grid to play a game of solitaire which, when played correctly on a correctly constructed grid ends up spelling out three words. There is a certain amount of trial and error involved in finding the solution!

    So to aid playing the game in the second part of the puzzle I wrote the following script. The gameGrid is configured for a partial solution of the game. A feature of the code is that you can "save" the game state at any point then paste the saved gameGrid in place of the current grid to explore possibilities from that point.

    As far as I can tell developing tools of this sort is all part of the solution domain for the puzzle. They are very much one off puzzles as each "crossword" is a puzzle of a completely different nature, so it is very unlikely that this tool will be useful for another "Crossword Puzzle". But it is a cool use for Perl!

    Note that a few shortcuts have been taken in the code. In particular global variables are used, which I usually avoid. The rendered grid is not very pretty and the layout generally is rough, but good enough for the task at hand.

    Play consists of clicking on a "peg" (piece to be moved) then an "empty" cell ("_") skipping over one intervening piece. The skipped piece is removed and added to the "skipped" string. Moves can be undone back to the starting state. For instructions beyond these you will need to find the original puzzle instructions and create the starting grid.

    Optimising for fewest key strokes only makes sense transmitting to Pluto or beyond
Tk ASCII Draw on Canvas
4 direct replies — Read more / Contribute
by Discipulus
on Jun 03, 2019 at 06:57
    Hello folks!,

    another Tk CUFP from my part! It is working and is also a draft for a bigger project (you all know what I'm working on nowadays.. ;)

    This is an ASCII drawing program expoiting the best I'm able to from Canvas and their precious feature: tags.

    I left some commented code because I have some question in case some Tk expert has answers:

    -1 about binding modifiers: I planned the draw action when <Button1-Motion> is on: ie. when button 1 is pressed (modifier) and the pointer is moveing over the Canvas. No luck. The program below now uses <Control-Motion> and perhaps is even better (less mouse->less pain)

    -2 I noticed some strange behaviours with some key: £ aka sterling in Tk world and ° aka degree if I use one of them (now commented in the code) I get back a multichar: uppercase A with caret above plus the degree symbol, for instance.

    -3 I wonder how can I implement an export coordinates range in my Canvas: something like: when SHIFT modifier is on and Motion is on too I should tag tiles with something like selceted use a different color for them and haveing two buttons for export corrdinates and select nothing Seems this the right way?

    PS now you can draw fancy things like:


    There are no rules, there are no thumbs..
    Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.
Coordinate validator
2 direct replies — Read more / Contribute
by timpoiko
on May 17, 2019 at 05:41
    Dear monks. Some years ago I write small program which can validate coordinates (locations on the Earth) from user input. I didn't to restrict format of input and I wanted support English as well as Finnish.
Flat File Database (random access indexing)
2 direct replies — Read more / Contribute
by erichansen1836
on May 04, 2019 at 10:16

    UPDATE Monday June 3, 2019... I tested filling a 128-GIG flat file (containing 137_438_953_472 bytes) with 68,430 complete copies of the KJV Bible, at 2_008_451 bytes/Bible. I was able to get 8 times as many records (over 2 billion records) when switching to variable-length delimited records where I additionally compacted the data by 50% more by storing the text as random seeded Word-to-Code key mapped text using 1, 2, and 3 character codes (1/4 million of them to randomly choose from) generated solely from the character set {A-Z, a-z, 0-9}. Additionally, I used SHA-2 (256) digital signature generation on 1 copy of the Bible (2_008_451 bytes) to compare against real-time digital signature generation each time a different copy of the Bible is accessed through the DB GUI front-end. A sector/block of 31,102 records, 2_008_451 bytes (a complete copy of the Bible) is read in by one READ STATEMENT through the front-end, and a digital signature generated on-the-fly to compare against the original. If a different signature is produced, an auto-correct of the database occurs from a backup image for the effected sector/block of records only. This happens faster than you can blink.

    UPDATE Monday May 6, 2019... I tested a 114-GIG Flat File for random access of its records and it works on Windows 7 Home Premium O/S with a NTFS (NT File System) using 64-bit ActiveState ActivePerl for Windows version/release 5.26.1. and the File I/O syntax: sysopen, sysseek, $tell=sysseek(FH,0,1), sysread, syswrite, and close. The Flat File had 7500 copies of the Bible in it (7500 copies of the Bible * 31,102 verses/Bible copy, and at a fixed-length record size of 528 bytes, and over 233 million records). I used a single 2-GIG SDBM index file to index the records of the 114-GIG Flat File. I would have indexed a full 128-GIG Flat File, but I hit the 2-GIG limit with the single SDBM file used for indexing. A 2nd SDBM file would be needed to index the records in a 128-GIG Flat File from the 114-GIG mark to the 128-GIG mark i.e. Bible copy 7501 through 8369.

Find the array containing string and copy the file to other folder exactly
1 direct reply — Read more / Contribute
by SubaRavi
on Apr 05, 2019 at 02:19

    Find the array containing string and copy the file to other folder extactly

    use strict; use warnings; use File::Copy; use File::Find::Rule; use File::Find; use File::Basename; my $source_dir = "<Sorce Directory with specific files>"; my @doc=File::Find::Rule->file->name('*.xml')->in($source_dir); my $path="<parent folder>"; my @folders; find sub{ push @folders, "$File::Find::name" if (-d $File::Find::name); },$path; foreach my $fileformat (@doc){ my $baseFile=basename ($fileformat); $baseFile=~s/\.xml//isg;###handled xml for sake my @results = grep /$baseFile/, @folders; copy ($fileformat,@results); ###copied files to destination and ma +tched }
perl 2.01 on Cygwin
3 direct replies — Read more / Contribute
by rje
on Mar 26, 2019 at 19:02

    Even though I haven't programmed in C for a long time, I could get Perl2 compiled and running (a 387k binary!) in just a couple hours this afternoon on Cygwin.

    .Can I throw out the in-house malloc and other hand-rolled memory management code? What else can I do away with? How about all of the variant hardware #defines Larry had to make? Can't I simplify the code by aiming for one modern OS (Linux?) and Dockerizing it? And how about all that K&R C? Boy does that take me back... Can I shrink the binary by modernizing the code?

    $ perl2 -v This is perl 2, subversion 1 (v2.0.1) Copyright 1987-2019, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU GPL ( Documentation for Perl should be found on this system via "man perl". Point your browser at, the Perl Home Page. Patch level: 0

    I needed GCC, make, and byacc (softlinked to 'yacc'). Then, I had to make a few edits:

    1. stab.c: commented out extern errno and replaced it with: int errno;

    2. perl.h: commented out the #ifdef that declared sprintf().

    3. perl.h: commented out the declaration of times().

    4. perly.c: I changed the -v message to look more Perl-like.

    I might have made two earlier edits, but they were along the same lines of removing conflicting or redundant declarations.

    And now, as a reward, I've got perl 2 running on Cygwin on my laptop! I have to say, it was worth the effort!

    Onward to hack!

    -rwxrwxr-x+ 1 rje None 387058 Mar 26 17:52 perl2.exe
Multiplication digit persistence
4 direct replies — Read more / Contribute
by tobyink
on Mar 21, 2019 at 09:17

    Try to find a number that takes more than eleven steps.

    use v5.10; use strict; use warnings; use List::Util qw(product); sub per { my ($n) = @_; return if $n < 10; my $p = product split //, $n; return $p, per($p); } my @steps = per 277777788888899; my $steps = @steps; say "$steps steps"; say for @steps;
Conversions of SI Units
1 direct reply — Read more / Contribute
by choroba
on Feb 16, 2019 at 16:57
    My son (11) has just learned SI units and their prefixes at school. They started just with metres and litres, only some of the prefixes (mili, centi, deci, hecto, kilo) and they don't know the floating point yet. Because of his broken arm, he missed several days at school and needed to practice. So, I've written a Tk application for him to practice. It takes one parameter, the number of formulas to generate.

    Feel free to localize it using the constants at the beginning. Adding the floating point left as an exercise for the reader.

    It's been a practice for me, too, because of Function::Parameters.

    map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]
IPC::Msg Fork queue
1 direct reply — Read more / Contribute
by trippledubs
on Feb 01, 2019 at 09:11

    IPC::Msg as a fork safe queue. Couple caveats that make it less cool, the by-default maximum queue size seems to be very small. Configurable though by changing /proc/sys/kernel/msgmnb which is the max size in bytes of an individual queue up to 2^31 - 1 on my system at least. Check with  ipcs -l. You also have to delete the queue when finished. Or not if you want to use it later. You can also find the same queue in different scripts with ftok, not shown. You can also see queue sizes / number of messages with ipcs command, add flags to pull off different messages from the queue. You don't always have to do FIFO, you can add different kinds of messages to the same queue, and you can block or not block if you want to have multiple queues being worked at the same time.

    For complex data structures you would need to serialize or pack / unpack which other cpan modules may already address and better. Message queues are already documented in perlipc, but a little sugar show show versatile it can be. Basically add or remove from the queue with any child process not worrying about blocking / synchronization issues, but you can accidentally destroy the queue before it is empty, or leave an empty or not-empty queue hanging around that you would have to delete with icprm command.

    #!/usr/bin/env perl use strict; use warnings; use feature 'say'; use IPC::SysV qw/IPC_PRIVATE S_IRUSR S_IWUSR IPC_NOWAIT/; use IPC::Msg; $|++; use constant MSG_BYTES => 1024; my $q = IPC::Msg->new(IPC_PRIVATE,S_IRUSR|S_IWUSR); sub quit { $q->remove; } $SIG{INT} = \&quit; sub enqueue { my $msg = shift; my $msg_type = shift // 1; # Used for message selection, see msgsn +d(2) $q->snd($msg_type,$msg,IPC_NOWAIT) || die $!; } sub dequeue { my $type = shift // 1; # See msgop(2) my $msg; $q->rcv($msg,MSG_BYTES,$type,IPC_NOWAIT); #if ($!) { warn "$$ - $!" } return $msg // undef; } sub dequeue_block { my $msg; my $type = shift // 1; # See msgop(2) $q->rcv($msg,MSG_BYTES,$type); #if ($!) { warn "$$ - $!" } return $msg // undef; } sub isEmpty { my $stat = $q->stat; return $stat->qnum == 0; } sub isPrime { my $num = shift; return 1 if ($num < 4); return 0 if ($num %2 == 0); for (my $i=3; $i <= sqrt($num); $i+=2) { return 0 if $num % $i == 0; } return 1; } my $n_workers = shift // die ; enqueue($_) for (1..2_000_000); my $parent = $$; for (my $i=1; $i<$n_workers && $$ == $parent; $i++) { fork // die; } while (my $data = dequeue()) { if (isPrime($data)) { print "Prime: $data\n"; } } END { if ($$ == $parent) { 1 until wait == -1; quit; } }
    • Num Procs: Time(seconds)
    • 2^0 : 55.171
    • 2^1 : 35.073
    • 2^2 : 21.455
    • 2^3 : 15.121
    • 2^4 : 12.380
    • 2^5 : 11.080

    Update 2019-02-04 - You can't wait on grandchildren, changed code to only fork from parent. Fixed spelling of empty.

Add your CUFP
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":

  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?

    What's my password?
    Create A New User
    and the web crawler heard nothing...

    How do I use this? | Other CB clients
    Other Users?
    Others exploiting the Monastery: (6)
    As of 2020-08-12 12:52 GMT
    Find Nodes?
      Voting Booth?
      Which rocket would you take to Mars?

      Results (65 votes). Check out past polls.