perlfaq7.html
来自「perl教程」· HTML 代码 · 共 828 行 · 第 1/5 页
HTML
828 行
<?xml version="1.0" ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<!-- saved from url=(0017)http://localhost/ -->
<script language="JavaScript" src="../../displayToc.js"></script>
<script language="JavaScript" src="../../tocParas.js"></script>
<script language="JavaScript" src="../../tocTab.js"></script>
<link rel="stylesheet" type="text/css" href="../../scineplex.css">
<title>perlfaq7 - General Perl Language Issues</title>
<link rel="stylesheet" href="../../Active.css" type="text/css" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:" />
</head>
<body>
<script>writelinks('__top__',2);</script>
<h1><a>perlfaq7 - General Perl Language Issues</a></h1>
<p><a name="__index__"></a></p>
<!-- INDEX BEGIN -->
<ul>
<li><a href="#name">NAME</a></li>
<li><a href="#description">DESCRIPTION</a></li>
<ul>
<li><a href="#can_i_get_a_bnf_yacc_re_for_the_perl_language">Can I get a BNF/yacc/RE for the Perl language?</a></li>
<li><a href="#what_are_all_these_______punctuation_signs__and_how_do_i_know_when_to_use_them">What are all these $@%&* punctuation signs, and how do I know when to use them?</a></li>
<li><a href="#do_i_always_never_have_to_quote_my_strings_or_use_semicolons_and_commas">Do I always/never have to quote my strings or use semicolons and commas?</a></li>
<li><a href="#how_do_i_skip_some_return_values">How do I skip some return values?</a></li>
<li><a href="#how_do_i_temporarily_block_warnings">How do I temporarily block warnings?</a></li>
<li><a href="#what_s_an_extension">What's an extension?</a></li>
<li><a href="#why_do_perl_operators_have_different_precedence_than_c_operators">Why do Perl operators have different precedence than C operators?</a></li>
<li><a href="#how_do_i_declare_create_a_structure">How do I declare/create a structure?</a></li>
<li><a href="#how_do_i_create_a_module">How do I create a module?</a></li>
<li><a href="#how_do_i_create_a_class">How do I create a class?</a></li>
<li><a href="#how_can_i_tell_if_a_variable_is_tainted">How can I tell if a variable is tainted?</a></li>
<li><a href="#what_s_a_closure">What's a closure?</a></li>
<li><a href="#what_is_variable_suicide_and_how_can_i_prevent_it">What is variable suicide and how can I prevent it?</a></li>
<li><a href="#how_can_i_pass_return_a__function__filehandle__array__hash__method__regex_">How can I pass/return a {Function, FileHandle, Array, Hash, Method, Regex}?</a></li>
<li><a href="#how_do_i_create_a_static_variable">How do I create a static variable?</a></li>
<li><a href="#what_s_the_difference_between_dynamic_and_lexical__static__scoping_between_local___and_my__">What's the difference between dynamic and lexical (static) scoping? Between <a href="../../lib/Pod/perlfunc.html#item_local"><code>local()</code></a> and my()?</a></li>
<li><a href="#how_can_i_access_a_dynamic_variable_while_a_similarly_named_lexical_is_in_scope">How can I access a dynamic variable while a similarly named lexical is in scope?</a></li>
<li><a href="#what_s_the_difference_between_deep_and_shallow_binding">What's the difference between deep and shallow binding?</a></li>
<li><a href="#why_doesn_t_my__foo_____file___work_right">Why doesn't "my($foo) = <FILE>;" work right?</a></li>
<li><a href="#how_do_i_redefine_a_builtin_function__operator__or_method">How do I redefine a builtin function, operator, or method?</a></li>
<li><a href="#what_s_the_difference_between_calling_a_function_as__foo_and_foo__">What's the difference between calling a function as &foo and foo()?</a></li>
<li><a href="#how_do_i_create_a_switch_or_case_statement">How do I create a switch or case statement?</a></li>
<li><a href="#how_can_i_catch_accesses_to_undefined_variables__functions__or_methods">How can I catch accesses to undefined variables, functions, or methods?</a></li>
<li><a href="#why_can_t_a_method_included_in_this_same_file_be_found">Why can't a method included in this same file be found?</a></li>
<li><a href="#how_can_i_find_out_my_current_package">How can I find out my current package?</a></li>
<li><a href="#how_can_i_comment_out_a_large_block_of_perl_code">How can I comment out a large block of perl code?</a></li>
<li><a href="#how_do_i_clear_a_package">How do I clear a package?</a></li>
<li><a href="#how_can_i_use_a_variable_as_a_variable_name">How can I use a variable as a variable name?</a></li>
<li><a href="#what_does_bad_interpreter_mean">What does "bad interpreter" mean?</a></li>
</ul>
<li><a href="#author_and_copyright">AUTHOR AND COPYRIGHT</a></li>
</ul>
<!-- INDEX END -->
<hr />
<p>
</p>
<h1><a name="name">NAME</a></h1>
<p>perlfaq7 - General Perl Language Issues ($Revision: 1.28 $, $Date: 2005/12/31 00:54:37 $)</p>
<p>
</p>
<hr />
<h1><a name="description">DESCRIPTION</a></h1>
<p>This section deals with general Perl language issues that don't
clearly fit into any of the other sections.</p>
<p>
</p>
<h2><a name="can_i_get_a_bnf_yacc_re_for_the_perl_language">Can I get a BNF/yacc/RE for the Perl language?</a></h2>
<p>There is no BNF, but you can paw your way through the yacc grammar in
perly.y in the source distribution if you're particularly brave. The
grammar relies on very smart tokenizing code, so be prepared to
venture into toke.c as well.</p>
<p>In the words of Chaim Frenkel: "Perl's grammar can not be reduced to BNF.
The work of parsing perl is distributed between yacc, the lexer, smoke
and mirrors."</p>
<p>
</p>
<h2><a name="what_are_all_these_______punctuation_signs__and_how_do_i_know_when_to_use_them">What are all these $@%&* punctuation signs, and how do I know when to use them?</a></h2>
<p>They are type specifiers, as detailed in <a href="../../lib/Pod/perldata.html">the perldata manpage</a>:</p>
<pre>
$ for scalar values (number, string or reference)
@ for arrays
% for hashes (associative arrays)
& for subroutines (aka functions, procedures, methods)
* for all types of that symbol name. In version 4 you used them like
pointers, but in modern perls you can just use references.</pre>
<p>There are couple of other symbols that you're likely to encounter that aren't
really type specifiers:</p>
<pre>
<> are used for inputting a record from a filehandle.
\ takes a reference to something.</pre>
<p>Note that <FILE> is <em>neither</em> the type specifier for files
nor the name of the handle. It is the <code><></code> operator applied
to the handle FILE. It reads one line (well, record--see
<a href="../../lib/Pod/perlvar.html#_e_sol_">$/ in the perlvar manpage</a>) from the handle FILE in scalar context, or <em>all</em> lines
in list context. When performing open, close, or any other operation
besides <code><></code> on files, or even when talking about the handle, do
<em>not</em> use the brackets. These are correct: <a href="../../lib/Pod/perlfunc.html#item_eof"><code>eof(FH)</code></a>, <a href="../../lib/Pod/perlfunc.html#item_seek"><code>seek(FH, 0,
2)</code></a> and "copying from STDIN to FILE".</p>
<p>
</p>
<h2><a name="do_i_always_never_have_to_quote_my_strings_or_use_semicolons_and_commas">Do I always/never have to quote my strings or use semicolons and commas?</a></h2>
<p>Normally, a bareword doesn't need to be quoted, but in most cases
probably should be (and must be under <code>use strict</code>). But a hash key
consisting of a simple word (that isn't the name of a defined
subroutine) and the left-hand operand to the <code>=></code> operator both
count as though they were quoted:</p>
<pre>
<span class="variable">This</span> <span class="variable">is</span> <span class="variable">like</span> <span class="variable">this</span>
<span class="operator">------------</span> <span class="operator">---------------</span>
<span class="variable">$foo</span><span class="operator">{</span><span class="string">line</span><span class="operator">}</span> <span class="variable">$foo</span><span class="operator">{</span><span class="string">'line'</span><span class="operator">}</span>
<span class="string">bar</span> <span class="operator">=></span> <span class="variable">stuff</span> <span class="string">'bar'</span> <span class="operator">=></span> <span class="variable">stuff</span>
</pre>
<p>The final semicolon in a block is optional, as is the final comma in a
list. Good style (see <a href="../../lib/Pod/perlstyle.html">the perlstyle manpage</a>) says to put them in except for
one-liners:</p>
<pre>
<span class="keyword">if</span> <span class="operator">(</span><span class="variable">$whoops</span><span class="operator">)</span> <span class="operator">{</span> <span class="keyword">exit</span> <span class="number">1</span> <span class="operator">}</span>
<span class="variable">@nums</span> <span class="operator">=</span> <span class="operator">(</span><span class="number">1</span><span class="operator">,</span> <span class="number">2</span><span class="operator">,</span> <span class="number">3</span><span class="operator">);</span>
</pre>
<pre>
<span class="keyword">if</span> <span class="operator">(</span><span class="variable">$whoops</span><span class="operator">)</span> <span class="operator">{</span>
<span class="keyword">exit</span> <span class="number">1</span><span class="operator">;</span>
<span class="operator">}</span>
<span class="variable">@lines</span> <span class="operator">=</span> <span class="operator">(</span>
<span class="string">"There Beren came from mountains cold"</span><span class="operator">,</span>
<span class="string">"And lost he wandered under leaves"</span><span class="operator">,</span>
<span class="operator">);</span>
</pre>
<p>
</p>
<h2><a name="how_do_i_skip_some_return_values">How do I skip some return values?</a></h2>
<p>One way is to treat the return values as a list and index into it:</p>
<pre>
<span class="variable">$dir</span> <span class="operator">=</span> <span class="operator">(</span><span class="keyword">getpwnam</span><span class="operator">(</span><span class="variable">$user</span><span class="operator">))</span><span class="operator">[</span><span class="number">7</span><span class="operator">]</span><span class="operator">;</span>
</pre>
<p>Another way is to use undef as an element on the left-hand-side:</p>
<pre>
<span class="operator">(</span><span class="variable">$dev</span><span class="operator">,</span> <span class="variable">$ino</span><span class="operator">,</span> <span class="keyword">undef</span><span class="operator">,</span> <span class="keyword">undef</span><span class="operator">,</span> <span class="variable">$uid</span><span class="operator">,</span> <span class="variable">$gid</span><span class="operator">)</span> <span class="operator">=</span> <span class="keyword">stat</span><span class="operator">(</span><span class="variable">$file</span><span class="operator">);</span>
</pre>
<p>You can also use a list slice to select only the elements that
you need:</p>
<pre>
<span class="operator">(</span><span class="variable">$dev</span><span class="operator">,</span> <span class="variable">$ino</span><span class="operator">,</span> <span class="variable">$uid</span><span class="operator">,</span> <span class="variable">$gid</span><span class="operator">)</span> <span class="operator">=</span> <span class="operator">(</span> <span class="keyword">stat</span><span class="operator">(</span><span class="variable">$file</span><span class="operator">)</span> <span class="operator">)</span><span class="operator">[</span><span class="number">0</span><span class="operator">,</span><span class="number">1</span><span class="operator">,</span><span class="number">4</span><span class="operator">,</span><span class="number">5</span><span class="operator">]</span><span class="operator">;</span>
</pre>
<p>
</p>
<h2><a name="how_do_i_temporarily_block_warnings">How do I temporarily block warnings?</a></h2>
<p>If you are running Perl 5.6.0 or better, the <code>use warnings</code> pragma
allows fine control of what warning are produced.
See <a href="../../lib/Pod/perllexwarn.html">the perllexwarn manpage</a> for more details.</p>
<pre>
<span class="operator">{</span>
<span class="keyword">no</span> <span class="variable">warnings</span><span class="operator">;</span> <span class="comment"># temporarily turn off warnings</span>
<span class="variable">$a</span> <span class="operator">=</span> <span class="variable">$b</span> <span class="operator">+</span> <span class="variable">$c</span><span class="operator">;</span> <span class="comment"># I know these might be undef</span>
<span class="operator">}</span>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?