Difference between revisions of "Coding Gotchas"

From Dreamwidth Notes
Jump to: navigation, search
(Dreamwidth specific gotchas)
(explain gotcha)
Line 4: Line 4:
  
 
=== LJ::Entry->new always returns an LJ::Entry ===
 
=== LJ::Entry->new always returns an LJ::Entry ===
 +
 +
You might expect that given an invalid <code>ditemid</code>, you might get an undefined valid back--but that is not the case.  Check the <code>$entry->valid</code> sub instead.
  
 
<source lang="perl">
 
<source lang="perl">
 
 
my $entry = LJ::Entry->new( $u, ditemid => $deleted_ditemid );
 
my $entry = LJ::Entry->new( $u, ditemid => $deleted_ditemid );
 
print "Entry 1 is defined\n" if defined $entry;
 
print "Entry 1 is defined\n" if defined $entry;
 +
# use this instead of checking if the entry is defined
 
print "Entry 1 is valid\n" if defined $entry->valid;
 
print "Entry 1 is valid\n" if defined $entry->valid;
  
Line 14: Line 16:
 
print "Entry 2 is defined\n" if defined $entry;
 
print "Entry 2 is defined\n" if defined $entry;
 
print "Entry 2 is valid\n" if defined $entry->valid;
 
print "Entry 2 is valid\n" if defined $entry->valid;
 
 
</source>
 
</source>
  

Revision as of 20:56, 8 March 2011

This page documents coding "gotchas" where things might not turn out how you expect them to.

Dreamwidth specific gotchas

LJ::Entry->new always returns an LJ::Entry

You might expect that given an invalid ditemid, you might get an undefined valid back--but that is not the case. Check the $entry->valid sub instead.

my $entry = LJ::Entry->new( $u, ditemid => $deleted_ditemid );
print "Entry 1 is defined\n" if defined $entry;
# use this instead of checking if the entry is defined
print "Entry 1 is valid\n" if defined $entry->valid;
 
$entry = LJ::Entry->new( $u, ditemid => $valid_ditemid );
print "Entry 2 is defined\n" if defined $entry;
print "Entry 2 is valid\n" if defined $entry->valid;

Returns

Invalid language.

You need to specify a language like this: <source lang="html4strict">...</source>

Supported languages for syntax highlighting:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, apt_sources, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, ocaml-brief, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, php-brief, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, s2, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic


Entry 1 is defined
Entry 2 is defined
Entry 2 is valid

$r->OK is 0

$r->OK is 0, not 200

General Perl gotchas

You can modify ...

use strict;
 
my $x;
 
print "x is '$x'\n";
foo($x);
print "x is now '$x'\n";
 
sub foo { $_[0] = "bar"; }

Returns

Invalid language.

You need to specify a language like this: <source lang="html4strict">...</source>

Supported languages for syntax highlighting:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, apt_sources, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, ocaml-brief, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, php-brief, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, s2, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic


x is ''
x is now 'bar'

use strict + my $foo if

use strict;
 
my $x = -1 if 0; # intentional false, for example.
$x = 1; # This accesses a *global, persistent across requests* $x

The condition can be anything, and this bug only happens if the "my $x" line does not execute because of the condition, if the condition is true then it will end up using the local as expected.

strict does not complain about this.

Do the following instead:

use strict;
 
my $x;
$x = -1 if 0;
$x = 1;