Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Seekers of Perl Wisdom

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

If you have a question on how to do something in Perl, or you need a Perl solution to an actual real-life problem, or you're unsure why something you've tried just isn't working... then this section is the place to ask. Post a new question!

However, you might consider asking in the chatterbox first (if you're a registered user). The response time tends to be quicker, and if it turns out that the problem/solutions are too much for the cb to handle, the kind monks will be sure to direct you here.

User Questions
Hash or Array - Logic Help
3 direct replies — Read more / Contribute
by audioboxer
on May 29, 2020 at 23:26
    Hi Everyone, I'm parsing XML data using xml:libxml and am trying to determine the last category based on "category_id" and "parent_id" but can't figure out the logic to do it through hashes or arrays. The XML looks like this where the last category should be "Carrot"
    <products> <product> <categories> <category> <category_id>443120</category_id> <name>Vegetables</name> <parent_id>443026</parent_id> </category> <category> <category_id>445720</category_id> <name>Carrot</name> <parent_id>443120</parent_id> </category> <category> <category_id>443026</category_id> <name>Food</name> </category> </categories> </product> <products>
    I've put it into a hash like this but can't figure out how to loop through the hash and determine the last category.
    $VAR1 = { 'Vegetables' => { 'id' => '443120', 'parent_id' => '443026' }, 'Food' => { 'parent_id' => '', 'id' => '443026' }, 'Carrot' => { 'parent_id' => '443120', 'id' => '445720' } };
    This is my current code
    foreach my $part ($dom->findnodes('/products/product')) { foreach my $categories($part->findnodes('./categories/category')) +{ $cat_name = $categories->findvalue("name"); $cat_id = $categories->findvalue("category_id"); $cat_parent_id = $categories->findvalue("parent_id"); $catdata{$cat_name} = {"id" => $cat_id, "parent_id" => $cat_pa +rent_id}; } }
matching lines in a long string
2 direct replies — Read more / Contribute
by Cristoforo
on May 29, 2020 at 20:29
    Hello monks!

    Been working on this problem and can't find my error. I'm trying to use the m modifier to read a large text in line by line. I want to use the inline form, (?m) rather than following the regex slash with m.

    #!/usr/bin/perl use strict; use warnings; use feature 'say'; my $s = <<'EOF'; int t; //variable t t->a=0; //t->a does;; something printf("\nEnter the Employee ID : "); scanf("%d", ptrx->eid); //employee id ptrx->eid printf("\nEnter the Employee Name : "); scanf("%s", ptr->name); return 0; EOF for my $line (split/(?m)\n(?=$)/, $s) { say '<' . $line . '>'; }
    I wonder if anyone can see why it isn't working. The output is:

    C:\Old_Data\perlp>perl test3.pl <int t; //variable t t->a=0; //t->a does;; something printf("\nEnter the Employee ID : "); scanf("%d", ptrx->eid); //employee id ptrx->eid printf("\nEnter the Employee Name : "); scanf("%s", ptr->name); return 0;>
    It isn't reading 'line by line'. Thanks for any help you might offer!

    Update: It works ok without the extra specifiers if i just do for my $line (split/\n/, $s)

    But wondering why.

Summing numbers in a file
4 direct replies — Read more / Contribute
by pvfki
on May 29, 2020 at 19:33
    If I have a file with two numbers, say: numbers.txt:
    2+3
    I want to create a program which will output the sum of those numbers in a different file called sum: sum.txt:
    5
    Here is what I have so far: sum.pl
    #!/usr/bin/perl -w use warnings 'all'; use strict; my $filename = 'numbers.txt'; open(N, '<', $filename); chomp (my $numbers = <N>); my $sum = eval $numbers; my $outfile = "sum.txt"; open FILE, '>'.$outfile; print FILE $sum; close FILE;
    Use of uninitialized value $sum in print at sum.pl line 17, <N> line 1.

    The file could actually have more than two numbers, the program just needs to read the string expression in the file, and output the sum to another file. Thanks for help.

Collapsing smaller scripts into a larger one, request for comment
2 direct replies — Read more / Contribute
by Lady_Aleena
on May 29, 2020 at 13:35

    I have been trying to decide for weeks whether or not I want to collapse most of my individual page-scripts (scripts that act like web pages) into their indexes and use a touch of CGI:Minimal to switch the text on a click. Below are the page-scripts for my Collections where you can see how similar they are above the __DATA__.

    Link to all of the Collections; links to the modules: Base::Page (page and story), Util::StoryMagic, Util::StoryMagic::Collection.

    index.pl
    Fiction.pl
    Movies.pl
    Music_and_comedy.pl
    Programs.pl
    Tie-ins.pl

    With the above being so similar, I can collapse them into one umbrella script that is below.

    (file_directory and file_list are in Util::Data in the above and in the sub below.)

    The above script works as expected, but I would not be posting here if there were not a problem. The problem is my site's menu is built by recursing through the directory structure of my site and uses the files and directories it finds to make the menu. If I were to collapse the 155 page-scripts into the 25 index scripts, I would lose the links to the topics those separate page-scripts now have. I did something very close to this a while ago, and I have not liked that the directory does not have entries for each topic. That directory may not get any traffic because it appears that there is nothing much there.

    Side note, I did not realize I had so many page-scripts.

    I use my base_menu sub (below) to make the menu for my site and would like to know how you would populate the directories that have only one file in them. With base_menu, all I have to do is add a page-script and refresh, and the menu is updated. Without those page-scripts, the menu will be almost empty.

    (base_menu is in Util::Menu, name_sort and article_sort are in Util::Sort, textify is in Util::Convert.)

    So, why did I post this? I would like to know if this way appears better? I also need ideas on how to collapse these page-scripts into their indexes without losing the automatic addition to the menu that I have now. There are a few scripts that do not use story, and those are the hardest to figure out how to add to the menu since they will not have a text file to go with it.

    Thank you for reading this latest bit of my craziness.

    My OS is Debian 10 (Buster); my perl versions are 5.28.1 local and 5.8.8 on web host.

    Version control is a non-issue, I do not use it.

    No matter how hysterical I get, my problems are not time sensitive. So, relax, have a cookie, and a very nice day!
    Lady Aleena
Are defined or // garantee not to autovivify?
5 direct replies — Read more / Contribute
by NisSam
on May 29, 2020 at 09:03
    Hello all.

    I have a question about hash autovivification. I can check how it really works but I want to be sure that this behavior will not change in the future. So I need some reference to documentation.

    If we have hash variable %hashtest, is it always guaranteed that defined($hashtest{abc}) or $hashtest{abc} // '?' will not autovivify for not existing keys? Or one have to always use exists($hashtest{abc}) && defined($hashtest{abc}) mantra?

[SOLVED-ISH]DBI Connection Fails with Access Denied on one version of Perl/DBD::MySQL and work on the other
2 direct replies — Read more / Contribute
by varneraa
on May 29, 2020 at 01:29
    EDIT: Solved-ish. Part of my problem appears to have been that I only added the bin area of the MySQL version to my path before calling cpanm to build DBD::mysql. Once I added the lib area of the mysql version as well and rebuilt 4.043 DBD::mysql I now have a working version. However, this seems super fragile. 4.050 DBD::mysql still doesn't work and DBD::MariaDB still doesn't work. This was all with the 5.26.1 version of Perl. I am going to give this a try on my original repo with 5.30.2 and see if it works. At least there is a little light at the end of this tunnel. I'd still love to figure out the right way to do all of this.

    TLDR:
    PROBLEM: Access denied for user 'USER_REPLACED'@'IP_REPLACED' (using password: YES) error 1045 recorded: Access denied for user 'USER_REPLACED'@'IP_REPLACED' (using password: YES)
    WORKS: DBI 1.639-nothread w/ 5.26.1 perl w/ DBD::mysql 4.043 from standard install path in controlled linux environment connects to MariaDB 10.2 in internal dbaas cloud
    NO DICE: DBI 1.643-nothread w/ 5.30.2 Perl w/ DBD::mysql 4.050 from perlbrew install path in controlled linux environment fails to connect to MariaDB 10.2 in internal dbaas cloud
    NO DICE: DBI 1.616-nothread w/ 5.14.1 Perl w/ DBD::mysql 4.020 from standard install path in controlled linux environment also fails to connect to MariaDB 10.2 in internal dbaas cloud

    Same script, same host, repeatable, but version dependent(maybe?) failures. So the question remains, how can I debug and fix this? I've many other posts on this error, but they are usually a config issue with the DB or a bad username/password. If this failed across the board I would think I was in the same boat, but the same code works on a specific perl install.

    Full fat version:
    I'm stumped. I work in a fairly restricted computing environment with pre-installed Perl and libraries. Several years ago now I picked up perlbrew as a way to allow me to develop tools that used CPAN libraries not preinstalled with the available Perl versions on our systems.

    Getting DBD::MySQL was a pain, since it requires mysql_config availability, which is not part of the normal path in this environment. Thanks to some other help I was able to get it installed and was able to get my perlbrewed script to connect to a MySQL db I use internally. Yay! Not so much.

    This new DB I am working on uses an internal dbaas mariaDB instance: MYSQL (MariaDB 10.2). With the stock version of Perl in our environment 5.14.1 I fail to connect, with a second standard install Perl version 5.26.1 I am able to connect, and finally, with my PerlBrewed 5.30.2 I am unable to connect.

    In each case, I am using an identical script and just changing the Perl version that is installed to isolate variables in my testing.

    #!/STANDARDINSTALLPATHTHATWORKS/5.26.1/bin/perl use strict; use warnings; use Data::Dumper; use DBI; my $database = "DB_REMOVED"; my $hostname = "HOST_REMOVED"; my $port = "PORT_REMOVED"; my $user = "USER_REMOVED"; my $pass = "PASS_REMOVED"; my $dsn = "DBI:mysql:database=$database;host=$hostname;port=$port"; DBI->trace(2); my $dbh = DBI->connect($dsn, $user, $pass) or die("Failed to connect t +o DB: $!");
    I found DBI's trace function, but it hasn't told me anything new, but here are the outputs first from the failing one(perlbrew) and then from the passing one:
    DBI 1.643-nothread default trace level set to 0x0/2 (pid 87123 pi +0) at dbtest line 20 -> DBI->connect(DBI:mysql:database=DB_REPLACED;host=HOSTNAME_REPLA +CED;port=PORT_REPLACED, USER_REPLACED, ****, HASH(0x9094f0)) -> DBI->install_driver(mysql) for linux perl=5.030002 pid=87123 ru +id=ID_REPLACED euid=ID_REPLACED install_driver: DBD::mysql version 4.050 loaded from PRIVATEPER +LBREWINSTALL/extlib/lib/perl5/x86_64-linux/DBD/mysql.pm <- install_driver= DBI::dr=HASH(0xc91698) !! The warn '0' was CLEARED by call to connect method -> connect for DBD::mysql::dr (DBI::dr=HASH(0xc91698)~0xce2e38 'da +tabase=DB_REPLACED;host=HOSTNAME_REPLACED;port=PORT_REPLACED' 'USER_R +EPLACED' **** HASH(0xb558d0)) imp_dbh->connect: dsn = database=DB_REPLACED;host=HOSTNAME_REPLACED;po +rt=PORT_REPLACED, uid = USER_REPLACED, pwd = PASSWORD_REPLACED imp_dbh->my_login : dbname = DB_REPLACED, uid = USER_REPLACED, pwd = P +ASSWORD_REPLACED,host = HOSTNAME_REPLACED, port = PORT_REPLACED imp_dbh->mysql_dr_connect: host = |HOSTNAME_REPLACED|, port = PORT_REP +LACED, uid = USER_REPLACED, pwd = PASSWORD_REPLACED imp_dbh->bind_type_guessing: 0 imp_dbh->use_server_side_prepare: 0 imp_dbh->disable_fallback_for_server_prepare: 0 imp_dbh->mysql_dr_connect: client_flags = 2 imp_dbh->mysql_dr_connect: <- --> do_error Access denied for user 'USER_REPLACED'@'IP_REPLACED' (using password: +YES) error 1045 recorded: Access denied for user 'USER_REPLACED'@'IP_ +REPLACED' (using password: YES) <-- do_error -> DESTROY for DBD::mysql::db (DBI::db=HASH(0xce33f0)~INNER) DESTROY for DBI::db=HASH(0xce33f0) ignored - handle not initi +alised ERROR: 1045 'Access denied for user 'USER_REPLACED'@'IP_REPLACE +D' (using password: YES)' (err#0) <- DESTROY= ( undef ) [1 items] at mysql.pm line 163 !! ERROR: 1045 'Access denied for user 'USER_REPLACED'@'IP_REPLACE +D' (using password: YES)' (err#0) <- connect= ( undef ) [1 items] at DBI.pm line 679 -> $DBI::errstr (&) FETCH from lasth=HASH <- $DBI::errstr= 'Access denied for user 'USER_REPLACED'@'IP_REPLA +CED' (using password: YES)' DBI connect('database=DB_REPLACED;host=HOSTNAME_REPLACED;port=P +ORT_REPLACED','USER_REPLACED',...) failed: Access denied for user 'US +ER_REPLACED'@'IP_REPLACED' (using password: YES) DBI connect('database=DB_REPLACED;host=HOSTNAME_REPLACED;port=PORT_REP +LACED','USER_REPLACED',...) failed: Access denied for user 'USER_REPL +ACED'@'IP_REPLACED' (using password: YES) at PRIVATEPERLBREWINSTALL/. +bin/dbtest line 21. -- DBI::END ($@: , $!: ) !! The ERROR '1045' was CLEARED by call to disconnect_all method -> disconnect_all for DBD::mysql::dr (DBI::dr=HASH(0xc91698)~0xce2 +e38) <- disconnect_all= ( ) [0 items] (not implemented) at DBI.pm line +758 ! -> DESTROY in DBD::_::common for DBD::mysql::dr (DBI::dr=HASH(0xce +2e38)~INNER) ! <- DESTROY= ( undef ) [1 items] during global destruction
    Passing one:
    DBI 1.639-nothread default trace level set to 0x0/2 (pid 87340 pi +0) at old_dbtest line 20 -> DBI->connect(DBI:mysql:database=DB_REPLACED;host=HOSTNAME_REPLA +CED;port=PORT_REPLACED, USER_REPLACED, ****) -> DBI->install_driver(mysql) for linux perl=5.026001 pid=87340 ru +id=ID_REPLACED euid=ID_REPLACED install_driver: DBD::mysql version 4.043 loaded from STANDARDEN +VINSTALLAREA/x86_64-linux/DBD/mysql.pm <- install_driver= DBI::dr=HASH(0x974b28) !! The warn '0' was CLEARED by call to connect method -> connect for DBD::mysql::dr (DBI::dr=HASH(0x974b28)~0x9ac9f8 'da +tabase=DB_REPLACED;host=HOSTNAME_REPLACED;port=PORT_REPLACED' 'USER_R +EPLACED' **** HASH(0x83f588)) imp_dbh->connect: dsn = database=DB_REPLACED;host=HOSTNAME_REPLACED;po +rt=PORT_REPLACED, uid = USER_REPLACED, pwd = PASSWORD_REPLACED imp_dbh->my_login : dbname = DB_REPLACED, uid = USER_REPLACED, pwd = P +ASSWORD_REPLACED,host = HOSTNAME_REPLACED, port = PORT_REPLACED imp_dbh->mysql_dr_connect: host = |HOSTNAME_REPLACED|, port = PORT_REP +LACED, uid = USER_REPLACED, pwd = PASSWORD_REPLACED imp_dbh->bind_type_guessing: 0 imp_dbh->use_server_side_prepare: 0 imp_dbh->disable_fallback_for_server_prepare: 0 imp_dbh->mysql_dr_connect: client_flags = 2 imp_dbh->mysql_dr_connect: <- <- connect= ( DBI::db=HASH(0x9acf80) +) [1 items] at DBI.pm line 676 -> STORE for DBD::mysql::db (DBI::db=HASH(0x9ad1a8)~INNER 'PrintEr +ror' 1) <- STORE= ( 1 ) [1 items] at DBI.pm line 728 -> STORE for DBD::mysql::db (DBI::db=HASH(0x9ad1a8)~INNER 'AutoCom +mit' 1) <- STORE= ( 1 ) [1 items] at DBI.pm line 728 -> STORE for DBD::mysql::db (DBI::db=HASH(0x9ad1a8)~INNER 'Usernam +e' 'USER_REPLACED') <- STORE= ( 1 ) [1 items] at DBI.pm line 731 -> STORE for DBD::mysql::db (DBI::db=HASH(0x9ad1a8)~INNER 'mysql_c +onn_attrs' HASH(0x9ad160)) $h->{'mysql_conn_attrs'}=HASH(0x9ad160) ignored for invalid driver-spe +cific attribute <- STORE= ( '' ) [1 items] at DBI.pm line 731 -> connected in DBD::_::db for DBD::mysql::db (DBI::db=HASH(0x9acf +80)~0x9ad1a8 'DBI:mysql:database=DB_REPLACED;host=HOSTNAME_REPLACED;p +ort=PORT_REPLACED' 'USER_REPLACED' ****) <- connected= ( undef ) [1 items] at DBI.pm line 738 <- connect= DBI::db=HASH(0x9acf80) -> STORE for DBD::mysql::db (DBI::db=HASH(0x9ad1a8)~INNER 'dbi_con +nect_closure' CODE(0x9ac890)) <- STORE= ( 1 ) [1 items] at DBI.pm line 747 Died at bin/old_dbtest line 24. -> DESTROY for DBD::mysql::db (DBI::db=HASH(0x9ad1a8)~INNER) imp_dbh->pmysql: 9c7aa0 <- DESTROY= ( undef ) [1 items] at old_dbtest line 24 -- DBI::END ($@: , $!: ) -> disconnect_all for DBD::mysql::dr (DBI::dr=HASH(0x974b28)~0x9ac +9f8) <- disconnect_all= ( ) [0 items] (not implemented) at DBI.pm line +755 ! -> DESTROY in DBD::_::common for DBD::mysql::dr (DBI::dr=HASH(0x9a +c9f8)~INNER) ! <- DESTROY= ( undef ) [1 items] during global destruction
Looking for assistance for proper fix for Spreadsheet::XLSX bug(?)
2 direct replies — Read more / Contribute
by nysus
on May 28, 2020 at 17:06

    I've gotten the ball to the 4 yard line on a problem I've been working on wrt to the Spreadsheet::XLSX module. Looking for help banging this problem into the end zone. I don't know enough about XLSX parsing to properly fix this.

    The problem:

    I'm parsing a .xlsx file generated by quickbooks. The spreadsheet has some custom format codes in it. Here's the appropriate xml from the styles.xml file embedded in the xlsx archive:

    <numFmt numFmtId="165" formatCode="#,##0.00\ _"/><numFmt numFmtId="16 +6" formatCode="&quot;$&quot;* #,##0.00\ _"/>

    When extracting data from the cell with this custom format code, the value looked like this:

    '20.00  '

    Note the euro symbol tacked on to the end. This symbol does not show up when viewing the spreadsheet.

    The hack:

    $PM = "Perl Monk's";
    $MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest Vicar";
    $nysus = $PM . ' ' . $MCF;
    Click here if you love Perl Monks

Getting start and end xml tags
3 direct replies — Read more / Contribute
by corfuitl
on May 28, 2020 at 08:38

    Hi

    I am trying to implement a function to split a sentence with XML tags in 3 parts. To be more clear, I want to parse a sentence with XML tags so that I will not have the wrapping tags. Input sentences are:

    <d id="43">Text </d> here <a id="33"/> <b id="33"/> Text <d id="43">text</d> here <d id="43">text here</d> <d id="43">text here</d> <d id="44">text here</d>

    Output should be

    start: "", middle: "<d id="43">Text </d> here", end: " <a id="33"/>" start: "<b id="33"/> ", middle: "Text <d id="43">text</d> here", end: +"" start: "<d id="43">", middle: "text here", end: "</d>" start: "", middle: "<d id="43">text here</d> <d id="44">text here</d>" +, end: ""

    I started my code but I don't think it's efficient. Any suggestions? a, b and c tags are self tags while d is always paired.

    my $segment = $_; my $start =""; my $end =""; my $middle =""; while ($segment =~ /^(<[a|b|c] id=\".*?\"\/>)/ || $segment =~ /^(\ +s+)/){ $start .= $1; $segment =~ s/^\Q$1\E//; } while ($segment =~ /(\s+)$/ || $segment =~ /(<[a|b|c] id=\".*?\"\/ +>)$/){ $end = "$1$end"; $segment =~ s/\Q$1\E$//; } while ($segment =~ /^(<d id=\".*?\">).*?(<\/d>)/){ ---- } print "start: \"$start\", middle: \"$middle\", end: \"$end\"\n";
Special character in file name -- die error messed up
3 direct replies — Read more / Contribute
by leszekdubiel
on May 28, 2020 at 04:53

    Is there any way to make "die" handle polish file names better? It's all about chars in file name. See:

    # cat ąćęłń.pl 
    #!/usr/bin/perl -CSDA
    
    use utf8; 
    
    die "language specific chars:  ąćęłń"; 
    
    
    # ./ąćęłń.pl 
    language specific chars:  ąćęłń at ./
    
        ó.pl line 5.
    
Tidy up json from nulls, empty arrays and hashes
2 direct replies — Read more / Contribute
by leszekdubiel
on May 28, 2020 at 04:27

    I need to clean json data from nulls, empty arrays, empty hashes. Current solution:

    #!/usr/bin/perl -CSDA # Removes empty arrays, empty objects, and nulls from json structure. use utf8; use Modern::Perl qw{2017}; use JSON; use Data::Dumper; sub tidyup_json { my ($r) = @_; if (ref $r eq "HASH") { for my $k (keys %$r) { tidyup_json($$r{$k}); delete $$r{$k} if (ref $$r{$k} eq "HASH" && ! %{$$r{$k}}) or (ref $$r{$k} eq "ARRAY" && ! @{$$r{$k}}) or ! defined $$r{$k}; } } elsif (ref $r eq "ARRAY") { tidyup_json($$r[$_]) for 0 .. @$r - 1; @$r = grep { not ( (ref $_ eq "HASH" && ! %$_) or (ref $_ eq "ARRAY" && ! @$_) or ! defined $_ ) } @$r; } # use "$_[0]", because "$_[0]" is an alias to real reference that +was passed to the function $_[0] = undef if (ref $r eq "HASH" && ! %$r) or (ref $r eq "ARRAY" && ! @$r); } my $json = JSON->new->allow_nonref->relaxed->decode(do { local $/; <ST +DIN>; }); tidyup_json($json); print JSON->new->pretty->allow_nonref->canonical->encode($json);

    What's the problem? See the "$_[0]" at the end of function? This is an alias for passed reference of json data. If that json data is empty hash, then the data must become "undef". So I have to modify data outside of function -- using alias. Is there more elegant way to handle it?

    Here are results:
    # echo '{"empty inner hash": {}, "empty inner array": [], "some undef" +: null }' | ./tidyup_json null # echo '{"empty inner hash": {}, "empty inner array": [1], "some undef +": null }' | ./tidyup_json { "empty inner array" : [ 1 ] } # echo '{"empty inner hash": {}, "empty inner array": [1], "some undef +": 7 }' | ./tidyup_json { "empty inner array" : [ 1 ], "some undef" : 7 } # echo '{ }' | ./tidyup_json ## !!! important to return null null

    PS. Beware that "true" and "false" jsonish data are references to blessed hashes.


Add your question
Title:
Your question:
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?
    Username:
    Password:

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

    How do I use this? | Other CB clients
    Other Users?
    Others contemplating the Monastery: (6)
    As of 2020-05-30 15:37 GMT
    Sections?
    Information?
    Find Nodes?
    Leftovers?
      Voting Booth?
      If programming languages were movie genres, Perl would be:















      Results (173 votes). Check out past polls.

      Notices?