CanIcreateglobalvariable(s)thatcanbeseenfromallcomponents?
Mason components each run in their own packages, so if you set a regular global in one you won't be able
to see it in the others.
But you can use allow_globals and set_global to create globals accessible from all components.
Whydoesmyoutputhaveextranewlines/whitespaceandhowcanIgetridofit?
See Whitespace And Newlines in the syntax manual. To suppress extra newlines you can use a backslash at
the end of each line, or you can use the NoBlankLines filter.
To emit binary data without the risk of inserting extra whitespace, surround your code with
$m->clear_buffer and $m->abort:
<%init>
$m->clear_buffer;
open(my $fh, '<', 'binary-file') or die $!;
my $buffer;
while (read $fh, $buffer, 8192) {
$m->print($buffer);
}
$m->abort;
</%init>
I'mtryingtogenerateanimageorotherbinaryfile,butitseemstobegettingcorrupted.
This is almost always caused by unwanted whitespace or other output at the beginning or end of your
binary data. Use $m->clear_buffer and $m->abort as in previous answer.
HowdoIputcommentsincomponents?
See Comments section in the syntax manual for reference.
• Put general comments in the "<%doc>" section.
• Within code blocks ("<%class>", "<%init>", "<%perl>", etc.), use standard Perl comments ('#').
• Use "<% # %>" for single or multi-line comments anywhere outside of Perl sections.
• If you are producing HTML, you can use standard HTML comments delimited by <!-- -->. The difference
is that these comments will appear in the final output.
What'sagoodwaytotemporarilycommentoutcodeinacomponent?
For HTML, you might be tempted to surround the section with "<!-- -->". But be careful! Any code inside
the section will still execute. Here's a example of commenting out a call to an ad server:
<!-- temporarily comment out
<& /shared/fetch_ad.mi &>
-->
The ad will still be fetched and counted, but not displayed!
A better way to block out a section is "if (0)":
% if (0) {
...
% }
Code blocked out in this way will neither be executed nor displayed, and multiple "if (0)" blocks can be
nested inside each other (unlike HTML comments).
Another way to block out code is with a "<%doc>" tag, although this not cannot be nested.
HowcanIcapturetheoutputofacomponent(andmodifyit,etc.)insteadofhavingitautomaticallyoutput?
Use $m->scomp.
HowcanIcapturetheoutputfromarbitrarycodethatcallscomponents,etc.?
Use $m->capture.
HowcanIgetalistofcomponentsmatchingapathpattern?
Use $m->glob_paths, e.g.
my @paths = $m->glob_paths('/some/comp/path/*');
This will work even with multiple component roots; you'll get a combined list of all matching component
paths in all component roots.
HowcanIaccess$m(therequestobject)fromoutsideacomponent,e.g.insidearegularclass?
Use Mason::Request->current_request:
package Foo;
sub bar {
my $m = Mason::Request->current_request;
}
Whenusingmultiplecomponentroots,isthereawaytoexplicitlycallacomponentinaspecificroot?
Multiple component roots were designed to work just like Perl's @INC. A given component path matches
exactly one file, the first file found in an ordered search through the roots. There is no way to
explicitly ask for a file in a specific root.