Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
####### # # E-scripts on Perl, Apache and cgis. # # Note 1: use the eev command (defined in eev.el) and the # ee alias (in my .zshrc) to execute parts of this file. # Executing this file as a whole makes no sense. # An introduction to eev can be found here: # # (find-eev-quick-intro) # http://angg.twu.net/eev-intros/find-eev-quick-intro.html # # Note 2: be VERY careful and make sure you understand what # you're doing. # # Note 3: If you use a shell other than zsh things like |& # and the for loops may not work. # # Note 4: I always run as root. # # Note 5: some parts are too old and don't work anymore. Some # never worked. # # Note 6: the definitions for the find-xxxfile commands are on my # .emacs. # # Note 7: if you see a strange command check my .zshrc -- it may # be defined there as a function or an alias. # # Note 8: the sections without dates are always older than the # sections with dates. # # This file is at <http://angg.twu.net/e/perl.e> # or at <http://angg.twu.net/e/perl.e.html>. # See also <http://angg.twu.net/emacs.html>, # <http://angg.twu.net/.emacs[.html]>, # <http://angg.twu.net/.zshrc[.html]>, # <http://angg.twu.net/escripts.html>, # and <http://angg.twu.net/>. # ####### # «.perl-doc» (to "perl-doc") # «.hex2c» (to "hex2c") # «.perl-nle» (to "perl-nle") # «.perldb» (to "perldb") # «.mimelite_zsh1» (to "mimelite_zsh1") # «.mimelite_zsh2» (to "mimelite_zsh2") # «.Getopt::Std» (to "Getopt::Std") # «.argv» (to "argv") # «.argc» (to "argc") # «.Data::Dumper» (to "Data::Dumper") # «.Net::NNTP» (to "Net::NNTP") # «.reading_a_file_at_once» (to "reading_a_file_at_once") # «.eval_in_regsub» (to "eval_in_regsub") # «.filter» (to "filter") # «.db_files» (to "db_files") # «.eepitch-perl» (to "eepitch-perl") # «.sepia» (to "sepia") # «.cpan-2020» (to "cpan-2020") ##### # # perl-doc # 2007may18 # ##### # «perl-doc» (to ".perl-doc") # (find-status "perl-doc") # (find-vldifile "perl-doc.list") # (find-udfile "perl-doc/") # (find-man "1 perl") # (find-man "1 perltoc") # (find-man "1 perlsyn") # (find-man "1 perldata") # (find-man "1 perlop") # (find-man "1 perlfunc") # (find-man "1 perlfunc" "print LIST") # (find-man "1 perlfaq") # (find-man "1 perlfaq1") # (find-man "1 perlfaq2") # (find-man "1 perlfaq4") # (find-man "1 perlfaq5") # (find-man "1 perlfaq6") # (find-man "1 perlfaq7") # (find-man "1 perlfaq8") # (find-man "1 perlrun") # (find-man "1 perldebug") ##### # # hex2c # 2007may18 # ##### # «hex2c» (to ".hex2c") # (find-man "1 perlfunc" "hex EXPR") # (find-man "1 perlfunc" "chr NUMBER") # (find-man "1 perlfunc" "write EXPR") # (find-man "1 perlop") # (find-man "1 perlop" "m//") # (find-man "1 perlfunc" "print") # (find-man "1 perlfunc" "printf FORMAT, LIST") # "write" doesn't work as I expected... ask for help #* echo '40 20.33 _ 0a' \ | tr ' .' \\n \ | perl -nle 'if (/^[0-9A-Za-z][0-9A-Za-z]$/) { print hex($_) }' #* * (eepitch-shell) * (eepitch-kill) * (eepitch-shell) perl -d -e 42 write("foo\n") write "foo\n" ; flush; hex("40"); print hex(40); print hex("40"); print chr(hex("40")); ##### # # perl -nle # 2000dec26 # ##### # «perl-nle» (to ".perl-nle") # (eeman "1p perlrun" "^ *-n") # (eeman "1p perlrun" "-nle") # (eeman "1p perlrun" "^ *-l") # (eeman "1p perlrun" "^ *-e") #* ls /tmp | perl -nle '$n++; print "$n: \"$_\""' ls /tmp | perl -nle 'print' ls /tmp | perl -nle 'printf "\"%s\"\n", $_' ls /tmp | perl -le 'while (<>) { printf "($_)" }' ls /tmp | perl -e 'while (<>) { print "($_)" }' #* # (eeman "1p perlop" "The null filehandle <>") # Use <STDIN> when you don't want the ARGV trick. ##### # # perldb # 2000nov17 # ##### # «perldb» (to ".perldb") # (find-pl5podfile "") # (find-pl5podfile "perlfaq3.pod" "How can I use Perl interactively?") # (find-pl5podfile "perldebug.pod") # (eeman "perlfaq3" "interactively") # (eeman "perldebug") # (find-pl5file "5.004/perl5db.pl") # (find-pl5file "5.005/perl5db.pl") #* cat > $EEG <<'---' h h h |h h --- eeg perl -de 42 #* # (perldb "perl /usr/sbin/update-alternatives --display wish") # (find-angg ".emacs" "gdbk-mode") #* # (gdbk-perldb t "/usr/sbin/update-alternatives --display wish" "" t) #* # (gdbk-perldb nil "/usr/sbin/update-alternatives --display wish") ##### # # string escape codes # 2000jul24 # ##### # «escape_codes» perl -e 'print "\100\n";' ##### # # opcodes # ##### apti perl-5.004-debug aptrm perl-5.004-debug # (find-status "perl-5.004-debug") # (find-vldifile "perl-5.004-debug.list") # (find-fline "/usr/doc/perl-5.004-debug/") cd /usr/lib/perl5/5.004/pod/ agrep -i opcode * | l -S # (eeman "perlguts" "Examining the tree") pdsc /debian/main/source/interpreters/perl_5.004.04-6.dsc cd /usr/src/perl-5.004.04 # # (find-fline "/usr/src/perl-5.004.04/debian/rules" "-D optimize='-O2' ") debian/rules binary |& tee odrb ##### # # Indexing # ##### cd /usr/lib/perl5/ find * -type f | grep -v '\.so$\|\.a$' > .files ##### # # ? # ##### # (find-fline "~/PERL/promit") # (setq w3-reuse-buffers 'yes) # (w3-open-local "/snarf/http/agora.leeds.ac.uk/Perl/start.html") http://agora.leeds.ac.uk/Perl/start.html Operações importantes: limpa os espaços, cd /usr/lib/perl5/ pod2man CGI.pm | groff -Tascii -man | l echo foobarplic | sed s/o/O/g echo foobarplic | sed 's/[oa]//g' # (find-fline "~/PERL/mysed") ##### # # CGI.pm # ##### # (find-fline "/usr/doc/perl/examples/cgi/") # (find-pl5file "") # (find-pl5file "CGI/") # (find-pl5file "CGI.pm") # (find-pl5file "CGI.pm" "=head1 DEBUGGING") # (find-pl5file "CGI.pm" "strong") # (find-pl5file "CGI.pm" "as_string") # (find-fline "/etc/apache/") # (find-fline "/etc/apache/httpd.conf") # (find-fline "/etc/apache/srm.conf" "/var/www") # (find-fline "/etc/apache/srm.conf" "AddHandler cgi-script .cgi") # (find-fline "/usr/doc/perl/examples/cgi/") # (find-fline "/var/www/perlex/") rm -Rv /var/www/perlex/ mkdir /var/www/perlex/ cd /var/www/perlex/ cp -iv /usr/doc/perl/examples/cgi/* . gzip -dv * perl RunMeFirst chmod 755 *.cgi chown edrx:edrx -Rc /var/www/perlex # (w3-fetch "http://0/perlex/") lynx http://0.0.0.0/perlex/ # (find-fline "/var/www/perlex/tryit.cgi") cd /var/www/perlex/ tryit.cgi '' tryit.cgi name=Edrx%20Foo color=Blue # (find-pl5podfile "perlfaq4.pod") # (find-pl5podfile "perlfaq5.pod") # (find-pl5podfile "perlfaq6.pod") # (find-pl5podfile "perlfaq7.pod") # (find-pl5podfile "perlfaq8.pod") # (find-pl5podfile "perlfaq9.pod" "send/read mail") dpkg -i ~/HASH/mailtools # (find-pl5file "Mail/") # (find-pl5file "Mail/Send.pm") # (find-pl5file "auto/Mail/") # (find-fline "~/PERL/m") use Mail::Internet; use Mail::Header; # say which mail host to use $ENV{SMTPHOSTS} = 'mail.frii.com'; # create headers $header = new Mail::Header; $header->add('From', '[email protected]'); $header->add('Subject', 'Testing'); $header->add('To', '[email protected]'); # create body $body = 'This is a test, ignore'; # create mail object $mail = new Mail::Internet(undef, Header => $header, Body => \[$body]); # send it $mail->smtpsend or die; cd /var/www/perlex/ a2ps -o ~/o.ps -M A4dj -6 -A --highlight-level=none $( cat index.html | perl -e 'foreach $li (<STDIN>) {$li =~ s/.*"(.*.cgi)".*/$1/ && print $li;}') cd rm o.p[0-9][0-9] gs -sDEVICE=djet500 -r300 -sOutputFile=o.p%02d -dNOPAUSE -dBATCH o.ps rm o.zip; zip o.zip o.p0? laf o.zip cat index.html | perl -e 'foreach $li (<STDIN>) { print $li;}' # (find-pl5file "CGI.pm") # (find-pl5file "CGI.pm") # (find-pl5file "pod/perlmod.pod") qualified # (w3-open-local "/usr/doc/HOWTO/html/Java-CGI-HOWTO.html") ##### # # dwww # ##### # (find-hamm "dwww") ###### # # Embedding Perl in text # ###### #!/usr/bin/perl print "a$BO\n"; print 'b$BO\n'; print 'c', 'foo'; print "\n\n\n"; (defun p () (interactive) (write-region (get-register ?b) (get-register ?e) "~/PERL/p") (set-file-modes "~/PERL/p" 511)) #!/usr/bin/perl $_ = "foo_bar"; print "Ok\n" if /.*foo.*/; print /.*o\(.*a\).*/; print "hello", "\n"; print ($a = [1, 2, 3]), "\n"; # (find-fline "~/PERL/tut0") #!/usr/bin/perl # (set-file-modes (buffer-file-name) 511) ###### # # Docs # ###### /snarf/ftp/agora.leeds.ac.uk/scs/doc/whole-perl-tutorial.readme /snarf/http/www.eecs.nwu.edu/perl/perl.html (find-fline "~/ZHTML/texps.ht") (find-fline "/snarf/ftp/agora.leeds.ac.uk/scs/doc/whole-perl-tutorial.txt.gz") (find-fline "/usr/doc/perl/examples") (find-fline "/usr/doc/perl/examples/cgi/") ####### # # a2ps on some docs # ####### l ~/TCL/spawn-send-expect-interact a2ps -8 -M A4dj -o ~/o.ps /usr/lib/perl5/CGI.pm rm ~/o.p[0-9][0-9] cd gs -sDEVICE=djet500 -r300 -sOutputFile=o.p%02d -dNOPAUSE -dBATCH o.ps rm o.zip; zip o.zip o.p0{1,2,3,4,5,6,7} rm o.zip; zip o.zip o.p{0{8,9},1{0,1}} # (find-node "(a2ps)Top") # (find-node "(a2ps)Sheets Options") # (find-fline "/usr/share/a2ps/sheets/") # (find-fline "/usr/share/a2ps/sheets/perl.ssh") ##### # # # ##### cd /usr/lib/perl5/ etags $(find * -name '*.p[ml]') # (code-c-d "pl5" "/usr/lib/perl5/") # (find-pl5file "CGI.pm") # (find-enode "Programs") # (find-enode "Font Lock") # (global-font-lock-mode t) # (list-faces-display) # (find-pl5file "i386-linux/5.004/DynaLoader.pm") # (find-pl5file "i386-linux/5.004/auto/DynaLoader/") # (find-pl5file "pod/perlxs.pod") # (find-pl5file "pod/perlxstut.pod") ###### # # perl-tk # ###### # (find-fline "/usr/doc/perl-tk/") # (find-fline "/usr/lib/perl5/Tk/") # (code-c-d "ptk" "/usr/src/perl-tk-400.202/") # (find-ptkfile "Manifest") # (find-ptkfile "") debsource /debian/main/source/interpreters perl-tk 400.202 -9 cd /usr/src/perl-tk-400.202/ cd /usr/src/perl-tk-400.202/demos/ widget ##### # # Sending MIME'd mail with MIME::Lite (and zsh) # ##### # «mimelite_zsh1» (to ".mimelite_zsh1") # Old version: function mailfile () { TO=$1 FILE=$2 perl -e ' use lib "$ENV{HOME}/PERL/"; use MIME::Lite; $msg = new MIME::Lite # From => $ENV{"FROM"}, To => $ENV{"TO"}, Subject => $ENV{"FILE"}, Data => ""; attach $msg Encoding => "base64", Type => "BINARY", Path => $ENV{"FILE"}, Filename => $ENV{"FILE"}; if (open SENDMAIL, "|/usr/sbin/sendmail -t -oi -oem") { $msg->print(\*SENDMAIL); close SENDMAIL; } else { print "Erro interno no sendmail: !=$!, ?=$?.\n"; }' } # Demo: cd ~/GIMP/; mailfile edrx tmp.jpg # «mimelite_zsh2» (to ".mimelite_zsh2") # New version: # Note that I'm using "su -s /usr/sbin/sendmail edrx --" instead of # simply "/usr/sbin/sendmail". function email_mimelite () { perl -e 'use lib "$ENV{HOME}/PERL/"; use MIME::Lite; '$1' if (open SENDMAIL, "|su -s /usr/sbin/sendmail edrx -- -t -oi -oem") { $msg->print(\*SENDMAIL); close SENDMAIL; } else { print "Erro interno no sendmail: !=$!, ?=$?.\n"; }' } function email850 () { 850toiso | TO=$1 SUBJ=$2 email_mimelite ' undef $/; $msg = new MIME::Lite To => $ENV{"TO"}, Subject => $ENV{"SUBJ"}, Encoding => "quoted-printable", Data => <>;' } function emailfile () { TO=$1 FILE=$2 email_mimelite ' $msg = new MIME::Lite To => $ENV{"TO"}, Subject => $ENV{"FILE"}, Data => ""; attach $msg Encoding => "base64", Type => "BINARY", Path => $ENV{"FILE"}, Filename => $ENV{"FILE"};' } # Demos: email850 edrx 'no subject' < ~/PERSONAL/99jun24 cd ~/GIMP/; emailfile edrx tmp.jpg ##### # # CPAN # 99nov27 # ##### # (find-fline "~/ICON/lslR2find.icn") # (find-fline "$SDEBIAN/ls-lR") # (find-fline "$SDEBIAN/ls-lR.i") # (find-fline "$SCPAN/ls-lR") # (find-fline "$SCPAN/ls-lR.i") psne $FCPAN/ls-lR.gz cd $SCPAN gzip -dv ls-lR.gz cd $SCPAN ~/ICON/lslR2find2 25 33 47 < ls-lR > ls-lR.i psne $FCPAN/authors/id/LDS/CGI.pm-2.56.tar.gz cd $SCPAN ~/ICON/lslR2find 2 -10 < ls-lR |& l -S ~/ICON/lslR2find 1 -10 < ls-lR |& l -S ~/ICON/lslR2find 0 -10 < ls-lR |& l -S ~/ICON/lslR2find 0 -8 < ls-lR |& l -S cd $SCPAN ~/ICON/lslR2find2 25 33 46 < ls-lR |& l -S ~/ICON/lslR2find2 26 33 47 < ls-lR |& l -S ~/ICON/lslR2find2 27 34 48 < ls-lR |& l -S ##### # # Getopt::Std # 2000may08 # ##### # «Getopt::Std» (to ".Getopt::Std") # (eeman "Getopt::Std") #* cat > /tmp/p <<'---' use Getopt::Std; use Net::SMTP; getopt('s'); print ":$opt_s:$ARGV[0]:\n" --- perl /tmp/p -s 'Foo' Bar perl /tmp/p -s 'Foo' perl /tmp/p Bar perl /tmp/p #* # Options after the straight args don't work: perl /tmp/p Bar -s 'Foo' # Were is it said that GNU's getopt accepts options after the other # args? Not in the obvious place: # (find-node "(libc)Getopt") ##### # # argv and argc # ##### # «argv» (to ".argv") # (find-man "1 perlvar" "@ARGV") # (find-man "1 perldata" "$#days") #* # «argc» (to ".argc") # About argc: perl -e 'print ":", @ARGV+0, ":\n";' perl -e 'print ":", @ARGV+0, ":\n";' an_arg #* perl -e 'print ":$#ARGV:\n";' perl -e 'print ":$#ARGV:\n";' foo perl -e 'print ":$#ARGV:\n";' foo bar perl -e 'print ":$#ARGV:\n";' foo bar plic #* ##### # # sendEmail # 2000may08 # ##### # «sendEmail» # (find-fline "$S/http/marvin.criadvantage.com/caspian/Software/SendEmail/sendEmail-v1.20.tar.gz") rm -Rv /usr/src/sendEmail/ cd /usr/src/ tar -xvzf $S/http/marvin.criadvantage.com/caspian/Software/SendEmail/sendEmail-v1.20.tar.gz cd /usr/src/sendEmail/ # (find-fline "/usr/src/sendEmail/sendEmail") # (find-fline "/usr/src/sendEmail/sendEmail" "sub help") cd /usr/src/sendEmail/ ./sendEmail -f hahaha -t edrx -u Teste -m Hello -vv # But instead of learning enough of this to use it to send email from # my machine bypassing the broken exim, I decided to perfect my code # that called Net::SMTP... and solved the problem. # (find-es "mail" "Net::SMTP2") # (find-fline "~/bin/sendemail") ##### # # Data::Dumper # 2000may09 # ##### # «Data::Dumper» (to ".Data::Dumper") # (eeman "CGI") # (eeman "CGI" "CGI.INPUTFILE.") # (find-pl5file "5.005/Data/Dumper.pm" "=head1") # pod2t /usr/lib/perl5/5.005/Data/Dumper.pm |& l #* echo foo=bar > /tmp/oc cat > /tmp/p <<'---' use CGI; open(QF, "/tmp/oc"); $query = new CGI(QF); # use Data::Dumper; print Dumper('$query', $query); sub pdump { print "\n $_[0] =\n", Dumper($_[1]); } pdump('$query', $query); --- perl /tmp/p #* # And this one shows some things about references. # (eeman "perlref") cat > /tmp/p <<'---' use Data::Dumper; sub pdump { print "\n $_[0] =\n", Dumper($_[1]); } @a = ['aa', 'bb']; $b = \@a; $c = ['aa', 'bb']; pdump('@a', @a); pdump('$b', $b); pdump('$c', $c); pdump('join', join('', @$c)); --- perl /tmp/p #* ##### # # Net::NNTP # 2000may09 # ##### # «Net::NNTP» (to ".Net::NNTP") # (eeman "Net::NNTP") # (find-pl5file "Net/NNTP.pm") # (find-pl5file "Net/NNTP.pm" "=item next") # (find-pl5file "Net/NNTP.pm" "=item newnews") # (find-fline "~/bin/sendemail") # (find-pl5file "5.005/Data/Dumper.pm") # First test: get the last (?) article. cat > /tmp/p <<'---' use Data::Dumper; sub pdump { print "\n $_[0] =\n", Dumper($_[1]); } use Net::NNTP; $nntp = Net::NNTP->new("news.inx.com.br", Debug => 1); $nntp->group("comp.lang.tcl"); pdump('$nntp', $nntp); $msgid = $nntp->next(); $art = $nntp->article($msgid); print join('', @$art); # Also works; this msgnum was extracted from an "Xref:" line by hand. #$art2 = # $nntp->article(138818); #print join('', @$art2); $nntp->quit; --- perl /tmp/p \ |& tee ~/o # Try to get all the articles posted in the last 24hs in a group. # First the list... (put it in ~/o2) # (find-es "mail" "RFCs") # (find-fline "~/tmp/rfc977.txt" "3.8.1. NEWNEWS") # (find-fline "~/tmp/rfc977.txt" "The date is sent as") # (find-pl5file "Net/NNTP.pm" "sub _timestr") # (find-pl5file "Net/NNTP.pm" "=item newnews") # (find-pl5file "Net/NNTP.pm" "=item date") cat > /tmp/p <<'---' use Data::Dumper;sub pdump{print"\n $_[0] =\n",Dumper($_[1]);} use Net::NNTP;$nntp=Net::NNTP->new("news.inx.com.br",Debug=>1); $date = $nntp->date(); pdump('$date', $date); $newnews = $nntp->newnews( $date - 24*3600, "comp.lang.tcl"); pdump('$newnews', $newnews); # open(O, "> $ENV{'HOME'}/o2") || die "Can't open o2"; print O join("\n", @$newnews); close(O); --- perl /tmp/p \ |& tee ~/o # (find-fline "~/o") # (find-fline "~/o2") cat > /tmp/p <<'---' $newnews = ["foo\n", "bar\n"]; open(O, "> $ENV{'HOME'}/o2") || die "Can't open"; print O join("\n", @$newnews); close(O); --- perl /tmp/p cat ~/o2 # ...and now the articles themselves, using the listing in ~/o2. # (eeman "perlsyn" "foreach my") rm -Rv /tmp/n/ mkdir /tmp/n/ cd /tmp/n/ cat > /tmp/p <<'---' use Data::Dumper;sub pdump{print"\n $_[0] =\n",Dumper($_[1]);} use Net::NNTP;$nntp=Net::NNTP->new("news.inx.com.br",Debug=>1); @articles = split("\n", `cat ~/o2`); $n = 0; foreach $msgid (@articles) { $art = $nntp->article($msgid); $fname = "> _" . sprintf("%03d", $n); open(O, $fname) || die "Can't open $fname"; print O join('', @$art); close(O); $n++; } --- perl /tmp/p mkdir ~/tmp/tclnews mv * ~/tmp/tclnews/ -v cd ~/tmp/tclnews/ # (find-fline "~/tmp/tclnews/") ##### # # reading an entire file at once # 2000oct02 # ##### # «reading_a_file_at_once» (to ".reading_a_file_at_once") # (eeman "perlvar" "input_record_separator HANDLE EXPR") # (eeman "perlop" "null filehandle") #* ls /tmp \ | perl -e 'undef $/; print "AAAA:", <>, ":ZZZZ\n";' #* ##### # # "/e" in regsub # 2001jan15 # ##### # «eval_in_regsub» (to ".eval_in_regsub") # (find-angg ".zshrc" "save-input") # (eeman "perlop" "abc246xyz") # (find-pl5podfile "perlop.pod" "abc246xyz") # (find-pl5podfile "perlfunc.pod" "=item chr\n") # (find-node "(zsh)Shell Builtin Commands" "echo") #* echo -ne '\r\a\n\f\t' \ | perl -nle ' s/[\000-\037]/"^".chr(ord($&)+64)/eg; print ' #* ##### # # filter # 2001jul11 # ##### # «filter» (to ".filter") # (eeman "1p perlfunc" "split /") # (eeman "1p perlop" " Quote and Quote-like Operators") #* # (find-angg ".zshrc" "filter") function filter () { WHICH=$1 \ perl -nle ' if (m/;;-> (.*)/) { $doprint = 0; for $p (split(/ /, $1)) { for $w (split(/,/, $ENV{"WHICH"})) { if ($p eq $w) { $doprint = 1 } } } } else { if ($doprint) { print; } } ' } cat > /tmp/file <<'---' one ;;-> foo two ;;-> bar baz three ;;-> foo baz four ;;-> fiv five --- cat /tmp/file | filter foo cat /tmp/file | filter bar cat /tmp/file | filter baz cat /tmp/file | filter foo,fiv #* ##### # # DB files # 2005oct27 # ##### # «db_files» (to ".db_files") # (find-man "3perl DB_File" "print the contents of the file") # (find-man "1 perlfunc" "tie VARIABLE,CLASSNAME,LIST") # (find-sh "file /var/cache/man/index.db") #* rm -Rv /tmp/mydb/ mkdir /tmp/mydb/ cd /tmp/mydb/ cat > foo.pl <<'%%%' use warnings ; use strict ; use DB_File ; our (%h, $k, $v) ; unlink "fruit" ; tie %h, "DB_File", "fruit", O_RDWR|O_CREAT, 0666, $DB_HASH or die "Cannot open file 'fruit': $!\n"; # Add a few key/value pairs to the file $h{"apple"} = "red" ; $h{"orange"} = "orange" ; $h{"banana"} = "yellow" ; $h{"tomato"} = "red" ; # Check for existence of a key print "Banana Exists\n\n" if $h{"banana"} ; # Delete a key/value pair. delete $h{"apple"} ; # print the contents of the file while (($k, $v) = each %h) { print "$k -> $v\n" } untie %h ; %%% perl foo.pl #* cd /tmp/mydb/ cat > bar.pl <<'%%%' use warnings ; use strict ; use DB_File ; our (%h, $k, $v) ; tie %h, "DB_File", "fruit", O_RDONLY, 0666, $DB_HASH or die "Cannot open file 'fruit': $!\n"; # print the contents of the file while (($k, $v) = each %h) { print "$k -> $v\n" } untie %h ; %%% perl bar.pl #* ##### # # eepitch-perl # 2009jul26 # ##### # «eepitch-perl» (to ".eepitch-perl") # (find-angg ".emacs" "perl") * (eepitch-perl) * (eepitch-kill) * (eepitch-perl) write("foo\n") write "foo\n" ; flush; hex("40"); print hex(40); print hex("40"); print chr(hex("40")); h h perl-doc perl-doc-html # (find-status "perl-doc") # (find-vldifile "perl-doc.list") # (find-udfile "perl-doc/") # (find-status "perl-doc-html") # (find-vldifile "perl-doc-html.list") # (find-udfile "perl-doc-html/") # (find-man "perldebug") ##### # # Sepia (Simple Emacs-Perl InterAction) # 2013jan02 # ##### # «sepia» (to ".sepia") # (find-available "sepia") ##### # # cpan-2020 # 2020jun28 # ##### # «cpan-2020» (to ".cpan-2020") # (find-asrootfile "/root/.cpan/") # (find-asrootfile "/root/.cpan/CPAN/") Autoconfiguration complete. commit: wrote '/root/.cpan/CPAN/MyConfig.pm' You can re-run configuration any time with 'o conf init' in the CPAN shell # https://lists.gnu.org/archive/html/bug-gnu-emacs/2023-02/msg00263.html git log -p --since="2021-10-01" --author luangruo -- | perl -ne 'chomp; $line = $_; if ($line =~ /^[ -]((DEFUN\s\()|[a-z]\S+\s\()/) { $prim = 1 if $2; $new = ""; substr($line,0,1) = "-"; $old = "$line\n"; } elsif ($old && $line =~ /^[-]/) { $old .= "$line\n" if $line =~ /[(),]/; } elsif ($old && $line =~ /^\+/) { $new .= "$line\n" if $line =~ /[(),]/; if (!$prim && $new =~ /\)\s*$/ || $prim && $new =~ /\d,\s*\d,\s*\d/) { print $old; print $new; $prim = $old = $new = ""; } } else { $prim = $old = $new = ""; }' # (find-sh "egrep '^[qwertyuiop]+$' /usr/share/dict/words | perl -lne '/(.*)/ and print length($1), \"\\t\", $1' | sort -nr | head -n 100") # (find-sh "egrep '^[aoeuidhtns]+$' /usr/share/dict/words | perl -lne '/(.*)/ and print length($1), \"\\t\", $1' | sort -nr | head -n 100") /x for whitespace and comments use re "debug" will cause the perl regex engine to spit out lots of comments about what it's doing use re 'debugcolor' perl -Mre=debugcolor -e '"hi" =~ /h([a-z]*)/' http://search.cpan.org/dist/Perl-Tidy/bin/perltidy http://www.csse.monash.edu.au/~damian/papers/HTML/Perligata.html https://news.ycombinator.com/item?id=28919910 The reports of Perl's death have been greatly exaggerated (phoenixtrap.com) https://news.ycombinator.com/item?id=33404658 The Perl Foundation will now be known as The Perl and Raku Foundation (perlfoundation.org) https://news.ycombinator.com/item?id=36569727 Perl 5.38 (perl.org) https://news.ycombinator.com/item?id=36650120 Perl first commit: a “replacement” for Awk and sed (github.com/perl) https://metacpan.org/pod/criticism https://metacpan.org/pod/Carton # Local Variables: # coding: utf-8-unix # End: