<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://pimg.daum-img.net/whsnake/css/atom.css?ver=1.0" type="text/css"?>
<feed xmlns="http://www.w3.org/2005/Atom" version="1.0" >
  <title>인생역전</title>
  <link rel="alternate" type="text/html" href="http://blog.daum.net/kihwanny"/>
  <link rel="self" type="application/atom+xml" href="http://blog.daum.net/xml/atom/kihwanny"/>
  <rights>기화니</rights>
  <author>
    <name>기화니</name>
    <uri>http://blog.daum.net/kihwanny</uri>
  </author>
  <generator uri="http://blog.daum.net" version="1.0">Daum blog (blogmaster@daum.net)</generator>
  <id>tag:blog.daum.net,2009:kihwanny</id>
  <updated>2009-10-10T11:52:34Z</updated>

  		<entry>
	    <title>Software Testing</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/kihwanny/166"/>
		<id>tag:blog.daum.net,2009:kihwanny.166</id>
	    <author>
		    <name>기화니</name>
	    </author>
	    <updated>2009-10-10T11:52:34Z</updated>
	    <published>2009-10-10T11:52:34Z</published>
	    <content type="html">
	    	&lt;A href=&quot;http://wrice.egloos.com/4279408&quot; target=_blank&gt;http://wrice.egloos.com/4279408&lt;/A&gt; 
&lt;P&gt;&lt;A href=&quot;http://wrice.egloos.com/4847290&quot; target=_blank&gt;http://wrice.egloos.com/4847290&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=urlLink onclick='smartLog(this, &quot;s=TO&amp;a=WRTO&amp;pg=1&amp;r=5&amp;p=2&amp;rc=5&amp;e1=A&amp;d=572cdeb8e5fcd2c8ba58c61c60dd5f044525acb4&amp;bt=1&amp;hs=1&amp;hi=0&quot;, event); return gUSRXLink(null, &quot;WRTO&quot;, &quot;1&quot;, &quot;2&quot;, &quot;&quot;, &quot;5&quot;, &quot;&quot;, &quot;&quot;, &quot;572cdeb8e5fcd2c8ba58c61c60dd5f044525acb4&quot;, &quot;1&quot;, &quot;&quot;, &quot;5&quot;, event);' href=&quot;http://www.cs.gmu.edu/~offutt/softwaretest/&quot; target=_blank&gt;&lt;U&gt;&lt;FONT color=#0000ff&gt;http://www.cs.gmu.edu/~offutt/softwaretest/&lt;/FONT&gt;&lt;/U&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;추천&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://www.vietnamesetestingboard.org/zbxe/?mid=General_Question_Answer&amp;document_srl=&amp;category=75351&quot;&gt;http://www.vietnamesetestingboard.org/zbxe/?mid=General_Question_Answer&amp;document_srl=&amp;category=75351&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://www.vietnamesetestingboard.org/zbxe/?mid=main&quot; target=&quot;_blank&quot;&gt;http://www.vietnamesetestingboard.org/zbxe/?mid=main&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>LG 텔레콤</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/kihwanny/159"/>
		<id>tag:blog.daum.net,2009:kihwanny.159</id>
	    <author>
		    <name>기화니</name>
	    </author>
	    <updated>2009-05-29T11:02:16Z</updated>
	    <published>2009-05-29T11:02:16Z</published>
	    <content type="html">
	    	&lt;A href=&quot;http://www.lgtelecom.com/&quot; target=&quot;_blank&quot;&gt;http://www.lgtelecom.com/&lt;/A&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>WSD와 골드웨이브로 mmf 벨소리 만들기</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/kihwanny/158"/>
		<id>tag:blog.daum.net,2009:kihwanny.158</id>
	    <author>
		    <name>기화니</name>
	    </author>
	    <updated>2009-04-30T09:03:15Z</updated>
	    <published>2009-04-30T09:03:15Z</published>
	    <content type="html">
	    	&lt;P&gt;1. 골드웨이브에서 mp3를 열고 구간선택&lt;/P&gt;
&lt;P&gt;2. mono right/left로 모노 변환&lt;/P&gt;
&lt;P&gt;3. 잡음제거후 wav로 저장&lt;/P&gt;
&lt;P&gt;4. WSD에서 wav를 열고&lt;/P&gt;
&lt;P&gt;5. MA5, 24KHz 설정 후 mmf로 저장&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>YAMAHA SMAF Global</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/kihwanny/157"/>
		<id>tag:blog.daum.net,2009:kihwanny.157</id>
	    <author>
		    <name>기화니</name>
	    </author>
	    <updated>2009-04-30T08:18:45Z</updated>
	    <published>2009-04-30T08:18:45Z</published>
	    <content type="html">
	    	&lt;P&gt;&lt;A href=&quot;http://smaf-yamaha.com/tools/downloads.html&quot; target=&quot;_blank&quot;&gt;http://smaf-yamaha.com/tools/downloads.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;&lt;A href=&quot;http://smaf-yamaha.com/tools/downloads.html#authoringtools&quot;&gt;&lt;IMG height=21 alt=&quot;Authoring Tools&quot; src=&quot;http://smaf-yamaha.com/tools/img/s_title_27s.gif&quot; width=264 border=0&gt;&lt;/A&gt; &lt;BR&gt;&lt;A href=&quot;http://smaf-yamaha.com/tools/downloads.html#multimedia&quot;&gt;&lt;IMG height=21 alt=&quot;Multimedia Tools&quot; src=&quot;http://smaf-yamaha.com/tools/img/s_title_54s.gif&quot; width=264 border=0&gt;&lt;/A&gt; &lt;BR&gt;&lt;A href=&quot;http://smaf-yamaha.com/tools/downloads.html#decorator&quot;&gt;&lt;IMG height=21 alt=&quot;Sound Decorator&quot; src=&quot;http://smaf-yamaha.com/tools/img/s_title_49s.gif&quot; width=264 border=0&gt;&lt;/A&gt; &lt;BR&gt;&lt;A href=&quot;http://smaf-yamaha.com/tools/downloads.html#converter&quot;&gt;&lt;IMG height=21 alt=Converters src=&quot;http://smaf-yamaha.com/tools/img/s_title_26s.gif&quot; width=264 border=0&gt;&lt;/A&gt; &lt;BR&gt;&lt;A href=&quot;http://smaf-yamaha.com/tools/downloads.html#utilitys&quot;&gt;&lt;IMG height=21 alt=Utilities src=&quot;http://smaf-yamaha.com/tools/img/s_title_47s.gif&quot; width=264 border=0&gt;&lt;/A&gt; &lt;BR&gt;&lt;A href=&quot;http://smaf-yamaha.com/tools/downloads.html#player&quot;&gt;&lt;IMG height=21 alt=Player src=&quot;http://smaf-yamaha.com/tools/img/s_title_56s.gif&quot; width=264 border=0&gt;&lt;/A&gt; &lt;BR&gt;&lt;A href=&quot;http://smaf-yamaha.com/tools/downloads.html#voicelibraries&quot;&gt;&lt;IMG height=21 alt=&quot;Voice Libraries&quot; src=&quot;http://smaf-yamaha.com/tools/img/s_title_28s.gif&quot; width=264 border=0&gt;&lt;/A&gt;&lt;/UL&gt;
&lt;P&gt;&lt;!--download menu--&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width=720 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width=20&gt;&lt;!--space--&gt;&lt;IMG height=1 alt=&quot;&quot; src=&quot;http://smaf-yamaha.com/shr/img/space.gif&quot; width=20&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>D2 - Family_Album_USA_01-2</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/kihwanny/149"/>
		<id>tag:blog.daum.net,2009:kihwanny.149</id>
	    <author>
		    <name>기화니</name>
	    </author>
	    <updated>2009-04-25T19:09:46Z</updated>
	    <published>2009-04-25T19:09:46Z</published>
	    <content type="html">
	    	&lt;P&gt;&lt;object type='application/x-shockwave-flash' width='477px' height='399px' align='middle' classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0'&gt;&lt;param name='movie' value='http://flvs.daum.net/flvPlayer.swf?vid=5-MLp3i43Tw$' /&gt;&lt;param name='allowScriptAccess' value='always' /&gt;&lt;param name='allowFullScreen' value='true' /&gt;&lt;param name='bgcolor' value='#000000' /&gt;&lt;embed src='http://flvs.daum.net/flvPlayer.swf?vid=5-MLp3i43Tw$' width='477px' height='399px' allowScriptAccess='always' type='application/x-shockwave-flash' allowFullScreen='true' bgcolor='#000000' &gt;&lt;/embed&gt;&lt;/object&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://tvpot.daum.net/clip/ClipViewByVid.do?vid=5-MLp3i43Tw$&quot;&gt;http://tvpot.daum.net/clip/ClipViewByVid.do?vid=5-MLp3i43Tw$&lt;/A&gt;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>HOWTO: Win32 API를 사용하여 응용 프로그램 열거</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/kihwanny/147"/>
		<id>tag:blog.daum.net,2009:kihwanny.147</id>
	    <author>
		    <name>기화니</name>
	    </author>
	    <updated>2009-03-30T13:57:36Z</updated>
	    <published>2009-03-30T13:57:36Z</published>
	    <content type="html">
	    	&amp;nbsp;
&lt;STYLE type=text/css&gt;  
    body 
    {
        
            background:url('/library/images/support/cn/gsfx_brnd_gn_top_bgrd.gif') repeat-x #C8E3F1;
        
    }

    
    
    #gsfx_brnd_SiteHeaderImage
    {
        height:0px;
    }
    
    
    
    .gsfx_brnd_NetworkLink, .gsfx_brnd_NetworkLink:visited, .gsfx_brnd_NetworkLink a, .gsfx_brnd_NetworkLink a:visited
    {
        color: #cdcbce;
    }
    
    .gsfx_brnd_NetworkLink:hover, .gsfx_brnd_NetworkLink:active, .gsfx_brnd_NetworkLink:focus, 
    .gsfx_brnd_NetworkLink a:hover, .gsfx_brnd_NetworkLink a:active, .gsfx_brnd_NetworkLink a:focus
    #gsfx_brnd_NetworkFooter .gsfx_brnd_NetworkLink:hover span, #gsfx_brnd_NetworkFooter .gsfx_brnd_NetworkLink:active span, #gsfx_brnd_NetworkFooter.gsfx_brnd_NetworkLink:focus span, 
    #gsfx_brnd_NetworkFooter .gsfx_brnd_NetworkLink a:hover span, #gsfx_brnd_NetworkFooter .gsfx_brnd_NetworkLink a:active span, #gsfx_brnd_NetworkFooter .gsfx_brnd_NetworkLink a:focus span
    {
        color: #f9d060;
        border-bottom-color: #f9d060;
    }
    
    #gsfx_brnd_NetworkHeader, #gsfx_brnd_NetworkHeaderLinks
    {
        color: #ffffff;
    }

    #gsfx_brnd_SiteHeader, #gsfx_brnd_PageLogoWrapper, #gsfx_brnd_PageTitle, #gsfx_brnd_SearchWrapper a, #gsfx_bsrch_poweredbycell span
    {
        color: #ffffff;
    }
    
    #gsfx_bsrch_catsel a, #gsfx_bsrch_catsel span
    {
        border-color: #ffffff;
    }

    #gsfx_brnd_SiteFooter, #gsfx_brnd_SiteFooterWrap
    {
        color: #ffffff;
    }

    #gsfx_brnd_NetworkFooter, #gsfx_brnd_FooterLinkContainer, #gsfx_brnd_FooterLinkContainer span, 
    #gsfx_brnd_copyright_container, #gsfx_brnd_copyright_container span
    {
        color: #ffffff;
    }
        
    
    &lt;/STYLE&gt;

&lt;STYLE type=text/css&gt;
    #gsfx_brnd_PageHeaderImage {background:none; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='', sizingMethod='image');}
    #gsfx_brnd_SiteImgWedge {background:none; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='', sizingMethod='scale');}    
    #gsfx_brnd_PageLogo {visibility:hidden;}
    #gsfx_brnd_legacy_PageLogo {filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/library/images/support/cn/gsfx_brnd_ms_logo.png', sizingMethod='image');}
    #gsfx_brnd_MSLogo {visibility:hidden;}
    #gsfx_brnd_legacy_MSLogo {filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/library/images/support/cn/gsfx_brnd_ms_logo_sml_wht.png', sizingMethod='image');}
&lt;/STYLE&gt;

&lt;DIV id=gsfx_brnd_CenterContent&gt;
&lt;DIV id=gsfx_brnd_PageWrapper&gt;
&lt;DIV id=gsfx_brnd_PageContainer style=&quot;HEIGHT: 578px&quot;&gt;
&lt;DIV id=gsfx_brnd_PageHeaderImage&gt;&lt;/DIV&gt;
&lt;DIV id=gsfx_brnd_HeaderContainer&gt;
&lt;DIV id=gsfx_brnd_NetworkHeader&gt;
&lt;DIV class=gsfx_brnd_NetworkLeft id=gsfx_brnd_CorpMarketingContainer&gt;
&lt;DIV class=gsfx_brnd_NetworkLeft id=gsfx_brnd_CorpMarketingSpace&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;!--Table is used here in order to properly order the links for LTR and RTL while maintaining the correct tab order--&gt;
&lt;TABLE class=gsfx_brnd_NetworkRight id=gsfx_brnd_NetworkHeaderLinks summary=&quot;Network Header Links&quot;&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=gsfx_brnd_NetworkLinkContainer&gt;&lt;SPAN id=gsfx_brnd_LocalName&gt;대한민국 &lt;/SPAN&gt;&lt;/TD&gt;
&lt;TD class=&quot;gsfx_brnd_NetworkLinkContainer gsfx_brnd_NetworkLink&quot;&gt;&lt;A id=L_156624 href=&quot;http://support.microsoft.com/common/international.aspx&quot;&gt;변경&lt;/A&gt; &lt;/TD&gt;
&lt;TD class=&quot;gsfx_brnd_NetworkLinkContainer gsfx_brnd_HeaderSeperator&quot;&gt;|&lt;/TD&gt;
&lt;TD class=&quot;gsfx_brnd_NetworkLinkContainer gsfx_brnd_NetworkLink&quot;&gt;&lt;A id=L_156623 href=&quot;http://www.microsoft.com/library/toolbar/3.0/sitemap/ko-kr.mspx&quot;&gt;Microsoft 전체 사이트&lt;/A&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;DIV id=gsfx_brnd_SiteHeader&gt;
&lt;DIV id=gsfx_brnd_SiteHeaderImageContainer&gt;
&lt;DIV id=gsfx_brnd_SiteHeaderImage&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=gsfx_brnd_NetworkLeft id=gsfx_brnd_legacy_PageLogo&gt;&lt;/DIV&gt;
&lt;DIV class=gsfx_brnd_NetworkLeft id=gsfx_brnd_PageLogoWrapper&gt;&lt;A id=gsfx_brnd_PageLogoLink href=&quot;http://www.microsoft.com/korea&quot;&gt;&lt;IMG id=gsfx_brnd_PageLogo alt=Microsoft src=&quot;http://support.microsoft.com/library/images/support/cn/gsfx_brnd_ms_logo.png&quot;&gt;&lt;/A&gt; &lt;SPAN id=gsfx_brnd_PageTitle&gt;고객지원&lt;/SPAN&gt; &lt;/DIV&gt;
&lt;DIV class=gsfx_brnd_NetworkRight id=gsfx_brnd_SearchWrapper&gt;&lt;/FORM&gt;
&lt;FORM id=frmsrch onsubmit=SaveSimpleSearch(); action=/search/default.aspx method=get&gt;
&lt;DIV id=gsfx_bsrch_catsel&gt;
&lt;SCRIPT type=text/javascript&gt;setACStartChars('4:4:');&lt;/SCRIPT&gt;
&lt;NOSCRIPT&gt;&lt;input type=&quot;hidden&quot; id=&quot;catalog&quot; name=&quot;catalog&quot; value=&quot;LCID=1042&quot; /&gt;&lt;/NOSCRIPT&gt;&lt;A class=&quot; gsfx_bsrch_highlight&quot; onclick=&quot;gsfx_bsrch_changeCatSelection(this,'LCID=1042');changeLcidForSelect(this, 'gsfx_bsrch_query', 'LCID=1042', '0');&quot; href=&quot;javascript: void(0);&quot; catalog=&quot;LCID=1042&quot;&gt;한글&lt;/A&gt; &lt;SPAN class=cat_seperator&gt;|&lt;/SPAN&gt; &lt;A class=&quot;&quot; onclick=&quot;gsfx_bsrch_changeCatSelection(this,'LCID=1033');changeLcidForSelect(this, 'gsfx_bsrch_query', 'LCID=1033', '1');&quot; href=&quot;javascript: void(0);&quot; catalog=&quot;LCID=1033&quot;&gt;영문&lt;/A&gt; &amp;nbsp;&lt;/DIV&gt;
&lt;DIV id=gsfx_bsrch_divQuery&gt;&lt;INPUT id=gsfx_bsrch_query maxLength=200 name=query autocomplete=&quot;off&quot; selectedIndex=&quot;-1&quot;&gt;&lt;SPAN class=gsfx_bsrch_buttonwrap id=gsfx_bsrch_srch&gt;&lt;INPUT id=gsfx_bsrch_srchbtn type=submit value=검색&gt;&lt;/SPAN&gt; &lt;SPAN class=gsfx_bsrch_buttonwrap id=gsfx_bsrch_websrch&gt;&lt;INPUT id=gsfx_bsrch_websrchbtn onclick=&quot;submitSimpleSearch('http://search.live.com/results.aspx?mkt=ko-KR&amp;q=', document.getElementById('gsfx_bsrch_query').value);&quot; type=button value=웹&gt;&lt;/SPAN&gt;&lt;BR&gt;
&lt;DIV id=acListWrappergsfx_bsrch_query style=&quot;WIDTH: 150px; POSITION: relative; HEIGHT: 1px&quot;&gt;
&lt;DIV id=acListDivgsfx_bsrch_query style=&quot;BORDER-RIGHT: #999 1px solid; PADDING-RIGHT: 1px; BORDER-TOP: #999 1px solid; PADDING-LEFT: 1px; FONT-SIZE: 0.7em; Z-INDEX: 99; BACKGROUND: #fff; VISIBILITY: hidden; PADDING-BOTTOM: 3px; MARGIN: -2px 0px 0px; OVERFLOW: hidden; BORDER-LEFT: #999 1px solid; WIDTH: 150px; PADDING-TOP: 3px; BORDER-BOTTOM: #999 1px solid; FONT-FAMILY: Verdana, Arial, Helvetica, Sans-Serif; POSITION: absolute&quot;&gt;&lt;/DIV&gt;&lt;IFRAME style=&quot;MARGIN-TOP: -2px; FILTER: progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0); VISIBILITY: hidden; WIDTH: 100%; POSITION: absolute; HEIGHT: 0px&quot; src=&quot;&quot;&gt;&lt;/IFRAME&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;SCRIPT type=text/javascript&gt;try{MS.Support.AC.MakeAutoComplete({id:'gsfx_bsrch_query', lcid:'1042', acURL:'http://autocomplete.support.microsoft.com', statsObj:StatsDotNet, startChar:'4', bubbleside:'left'});}catch(e){}&lt;/SCRIPT&gt;

&lt;DIV class=gsfx_brnd_NetworkTextRight id=gsfx_bsrch_poweredbycell&gt;&lt;SPAN&gt;제공&lt;/SPAN&gt;&lt;SPAN id=liveimg&gt;&lt;IMG class=gsfx_img_png style=&quot;WIDTH: 24px; HEIGHT: 24px&quot; alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/en-US/gsfx_bsrch_live_logo.png&quot;&gt; 
&lt;DIV class=gsfx_div_png style=&quot;FILTER: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/library/images/support/en-US/gsfx_bsrch_live_logo.png', sizingMethod='scale'); WIDTH: 24px; HEIGHT: 24px&quot; alt=&quot;&quot;&gt;&lt;/DIV&gt;&lt;/SPAN&gt;&lt;SPAN&gt;Live Search&lt;/SPAN&gt; &lt;/DIV&gt;
&lt;DIV class=hiddenformels&gt;&lt;INPUT type=hidden value=r name=mode&gt; &lt;/DIV&gt;&lt;NOSCRIPT&gt;&lt;style type=&quot;text/css&quot;&gt;#gsfx_bsrch_catsel a {display:none;} #gsfx_bsrch_websrch {display:none;}&lt;/style&gt;&lt;/NOSCRIPT&gt;&lt;SPAN&gt;&lt;INPUT id=catalog type=hidden value=LCID=1042 name=catalog&gt;&lt;/SPAN&gt;&lt;/FORM&gt;
&lt;FORM name=dataInfo&gt;
&lt;SCRIPT type=text/javascript&gt;
InitSrch();
InitAC('gsfx_bsrch_query');MS_AddEvent(window, 'load', function() {gsfx_bsrch_InitCatSelection('gsfx_bsrch_query', '4:4:');});
&lt;/SCRIPT&gt;
&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=gsfx_brnd_CornerContainer id=gsfx_brnd_TopCorners&gt;
&lt;DIV class=&quot;gsfx_brnd_TBBorders gsfx_brnd_TransBG&quot; id=gsfx_brnd_TopBorder&gt;&lt;/DIV&gt;
&lt;DIV class=gsfx_brnd_Corner id=gsfx_brnd_LUpperCorner&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;gsfx_brnd_TransBG gsfx_brnd_SideBorder&quot; id=gsfx_brnd_LocalToolBar&gt;
&lt;UL id=gsfx_brnd_LocalLinks&gt;
&lt;LI class=gsfx_brnd_LocalLink&gt;&lt;A id=L_156629 href=&quot;http://support.microsoft.com/&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#0000ff&gt;고객지원 홈&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI class=gsfx_brnd_LocalSeperator&gt;&amp;nbsp;&lt;/LI&gt;
&lt;LI class=gsfx_brnd_LocalLink&gt;&lt;A id=L_156630 href=&quot;http://support.microsoft.com/select/?target=hub&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#0000ff&gt;제품 솔루션 센터&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI class=gsfx_brnd_LocalSeperator&gt;&amp;nbsp;&lt;/LI&gt;
&lt;LI class=gsfx_brnd_LocalLink&gt;&lt;A id=L_156631 href=&quot;http://support.microsoft.com/search/?adv=1&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#0000ff&gt;고급 검색&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI class=gsfx_brnd_LocalSeperator&gt;&amp;nbsp;&lt;/LI&gt;
&lt;LI class=gsfx_brnd_LocalLink&gt;&lt;A id=L_157859 href=&quot;http://support.microsoft.com/gp/DOWNLOADOVER&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#0000ff&gt;다운로드 및 업데이트&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI class=gsfx_brnd_LocalSeperator&gt;&amp;nbsp;&lt;/LI&gt;
&lt;LI class=gsfx_brnd_LocalLink&gt;&lt;A id=L_157861 href=&quot;http://support.microsoft.com/contactus/?ws=support&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#0000ff&gt;문의처&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;gsfx_brnd_TransBG gsfx_brnd_SideBorder&quot; id=gsfx_brnd_ToolbarShadow&gt;
&lt;DIV id=gsfx_brnd_shadow&gt;&lt;FONT color=#0000ff&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;gsfx_brnd_TransBG gsfx_brnd_SideBorder&quot; id=gsfx_brnd_ContentContainer&gt;
&lt;DIV id=contentArea style=&quot;HEIGHT: 367px&quot;&gt;
&lt;DIV id=mainRow&gt;
&lt;DIV class=primaryTable&gt;
&lt;TABLE class=primaryTable cellSpacing=0 cellPadding=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=primaryMainColumn&gt;
&lt;DIV id=mainColumn&gt;
&lt;DIV class=kb id=kb&gt;
&lt;DIV class=&quot;kb_default ltr&quot; id=kb_default&gt;&lt;!-- - -KB 3 start- - --&gt;&lt;A id=top&gt;&lt;/A&gt;
&lt;DIV class=articleProperty&gt;기술 자료 ID: 175030 - 마지막 검토: 2004년 10월 3일 일요일 - 수정: 2.2&lt;/DIV&gt;
&lt;H1 class=title&gt;HOWTO: Win32 API를 사용하여 응용 프로그램 열거&lt;/H1&gt;
&lt;DIV class=appliesToLink&gt;&lt;A href=&quot;http://support.microsoft.com/kb/175030/ko#appliesto&quot;&gt;&lt;FONT color=#800080&gt;이 문서가 적용되는 제품 보기.&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;
&lt;SCRIPT type=text/javascript&gt;if (!loadTOCNode) {var loadTOCNode = function(){}}&lt;/SCRIPT&gt;

&lt;DIV class=section id=kb_section&gt;
&lt;H2 class=&quot;subTitle kb_tabs_toggle_closed&quot; id=tocTitle previewfixed=&quot;true&quot;&gt;
&lt;DIV class=&quot;kb_tabs_toggle kb_tabs_toggle_open&quot;&gt;&lt;FONT color=#800080&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;SPAN&gt;&lt;A href=&quot;javascript:void(0);&quot;&gt;&lt;FONT color=#0000ff&gt;이 페이지에서&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt; 
&lt;DIV class=sectionpreview_open&gt;&lt;/DIV&gt;&lt;/H2&gt;
&lt;DIV class=&quot;sbody kb_tabs_toggle_closed&quot; id=tocDiv style=&quot;DISPLAY: none; MARGIN-LEFT: 195px&quot;&gt;
&lt;UL style=&quot;DISPLAY: block&quot;&gt;
&lt;LI depth=&quot;1&quot;&gt;&lt;A onclick=&quot;return tocScrollTo(this);&quot; href=&quot;http://support.microsoft.com/kb/175030/ko#&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/downarrow.gif&quot;&gt;&lt;SPAN class=tocTxt&gt;&lt;FONT color=#800080&gt;요약&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt; 
&lt;UL class=tocLine&gt;&lt;/UL&gt;&lt;/LI&gt;
&lt;LI depth=&quot;1&quot;&gt;&lt;A onclick=&quot;return tocScrollTo(this);&quot; href=&quot;http://support.microsoft.com/kb/175030/ko#&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/downarrow.gif&quot;&gt;&lt;SPAN class=tocTxt&gt;&lt;FONT color=#800080&gt;추가 정보&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt; 
&lt;UL class=tocLine&gt;
&lt;LI depth=&quot;2&quot;&gt;&lt;A onclick=&quot;return tocScrollTo(this);&quot; href=&quot;http://support.microsoft.com/kb/175030/ko#&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/downarrow.gif&quot;&gt;&lt;SPAN class=tocTxt&gt;&lt;FONT color=#800080&gt;최상위 창 열거&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt; 
&lt;UL class=tocLine&gt;&lt;/UL&gt;&lt;/LI&gt;
&lt;LI depth=&quot;2&quot;&gt;&lt;A onclick=&quot;return tocScrollTo(this);&quot; href=&quot;http://support.microsoft.com/kb/175030/ko#&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/downarrow.gif&quot;&gt;&lt;SPAN class=tocTxt&gt;&lt;FONT color=#800080&gt;프로세스 열거&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt; 
&lt;UL class=tocLine&gt;&lt;/UL&gt;&lt;/LI&gt;
&lt;LI depth=&quot;2&quot;&gt;&lt;A onclick=&quot;return tocScrollTo(this);&quot; href=&quot;http://support.microsoft.com/kb/175030/ko#&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/downarrow.gif&quot;&gt;&lt;SPAN class=tocTxt&gt;&lt;FONT color=#800080&gt;ToolHelp32 라이브러리를 사용하여 프로세스 열거&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt; 
&lt;UL class=tocLine&gt;&lt;/UL&gt;&lt;/LI&gt;
&lt;LI depth=&quot;2&quot;&gt;&lt;A onclick=&quot;return tocScrollTo(this);&quot; href=&quot;http://support.microsoft.com/kb/175030/ko#&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/downarrow.gif&quot;&gt;&lt;SPAN class=tocTxt&gt;&lt;FONT color=#800080&gt;PSAPI 라이브러리를 사용하여 프로세스 열거&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt; 
&lt;UL class=tocLine&gt;&lt;/UL&gt;&lt;/LI&gt;
&lt;LI depth=&quot;2&quot;&gt;&lt;A onclick=&quot;return tocScrollTo(this);&quot; href=&quot;http://support.microsoft.com/kb/175030/ko#&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/downarrow.gif&quot;&gt;&lt;SPAN class=tocTxt&gt;&lt;FONT color=#800080&gt;16비트 프로세스&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt; 
&lt;UL class=tocLine&gt;&lt;/UL&gt;&lt;/LI&gt;
&lt;LI depth=&quot;2&quot;&gt;&lt;A onclick=&quot;return tocScrollTo(this);&quot; href=&quot;http://support.microsoft.com/kb/175030/ko#&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/downarrow.gif&quot;&gt;&lt;SPAN class=tocTxt&gt;&lt;FONT color=#800080&gt;예제 코드&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt; 
&lt;UL class=tocLine&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;
&lt;LI depth=&quot;1&quot;&gt;&lt;A onclick=&quot;return tocScrollTo(this);&quot; href=&quot;http://support.microsoft.com/kb/175030/ko#&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/downarrow.gif&quot;&gt;&lt;SPAN class=tocTxt&gt;&lt;FONT color=#800080&gt;참조&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt; 
&lt;UL class=tocLine&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/DIV&gt;
&lt;SCRIPT type=text/javascript&gt;
            var sectionFilter = &quot;type != 'notice' &amp;&amp; type != 'securedata' &amp;&amp; type != 'querywords'&quot;;
            var tocArrow = &quot;/library/images/support/kbgraphics/public/en-us/downarrow.gif&quot;;
            var depthLimit = 10;
            var depth3Limit = 10;
            var depth4Limit = 5;
            var depth5Limit = 3;
            var tocEntryMinimum = 1;
        &lt;/SCRIPT&gt;
&lt;NOSCRIPT&gt;&lt;style&gt;#tocTitle, #tocDiv{display: none;}&lt;/style&gt;&lt;/NOSCRIPT&gt;
&lt;DIV class=expandcollapseall_open id=kb_expandcollapseall&gt;&lt;A class=expandalltext href=&quot;javascript:void(0);&quot;&gt;&lt;FONT color=#0000ff&gt;모두 확대&lt;/FONT&gt;&lt;/A&gt; | &lt;A class=collapsealltext href=&quot;javascript:void(0);&quot;&gt;&lt;FONT color=#0000ff&gt;모두 축소&lt;/FONT&gt;&lt;/A&gt;
&lt;SCRIPT type=text/javascript&gt;
                    if (kb_page_object)
                    {
                    kb_page_object.kb_imageExpandHoverText = '그림 확대를 위해 클릭하시기 바랍니다';
                    }
                &lt;/SCRIPT&gt;
 &lt;/DIV&gt;
&lt;H2 class=subTitle id=tocHeadRef&gt;
&lt;DIV class=&quot;kb_tabs_toggle kb_tabs_toggle_open&quot;&gt;&lt;/DIV&gt;&lt;SPAN&gt;&lt;A href=&quot;javascript:void(0);&quot;&gt;&lt;FONT color=#0000ff&gt;요약&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt; 
&lt;DIV class=sectionpreview_closed&gt;한 가지 일반적인 프로그래밍 작업으로는 실행 중인 모든 &quot;응용 프로그램&quot;을 열거하는 작업이 있습니다. Windows 작업 관리자는 이러한 좋은...&lt;/DIV&gt;&lt;/H2&gt;
&lt;SCRIPT type=text/javascript&gt;
                            loadTOCNode(1, 'summary');
                        &lt;/SCRIPT&gt;

&lt;DIV class=sbody style=&quot;MARGIN-LEFT: 195px&quot;&gt;한 가지 일반적인 프로그래밍 작업으로는 실행 중인 모든 &quot;응용 프로그램&quot;을 열거하는 작업이 있습니다. Windows 작업 관리자는 이러한 좋은 예로, &quot;응용 프로그램&quot;을 두 가지 방식으로 나열합니다. 작업 관리자의 첫 번째 탭은 데스크톱에서 실행 중인 &quot;모든 응용 프로그램 창&quot;을 나열하며 두 번째 탭은 시스템의 모든 &quot;프로세스&quot;를 나열합니다. 이 문서에서는 이러한 두 작업을 수행하는 방법을 자세하게 설명합니다. 
&lt;DIV class=topOfPage&gt;&lt;A href=&quot;http://support.microsoft.com/kb/175030/ko#top&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/uparrow.gif&quot;&gt;&lt;FONT color=#800080&gt;위로 가기&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;H2 class=subTitle id=tocHeadRef&gt;
&lt;DIV class=&quot;kb_tabs_toggle kb_tabs_toggle_open&quot;&gt;&lt;FONT color=#800080&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;SPAN&gt;&lt;A href=&quot;javascript:void(0);&quot;&gt;&lt;FONT color=#0000ff&gt;추가 정보&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt; 
&lt;DIV class=sectionpreview_closed&gt;최상위 창 열거데스크톱의 프로세스 열거 작업과 최상위 창 열거 작업을 비교해 보면 최상위 창 열거 작업이 좀더 간단합니다. 최상위 창을 열거하려...&lt;/DIV&gt;&lt;/H2&gt;
&lt;SCRIPT type=text/javascript&gt;
                            loadTOCNode(1, 'moreinformation');
                        &lt;/SCRIPT&gt;

&lt;DIV class=sbody style=&quot;MARGIN-LEFT: 195px&quot;&gt;
&lt;H3 id=tocHeadRef&gt;최상위 창 열거&lt;/H3&gt;
&lt;SCRIPT type=text/javascript&gt;
                loadTOCNode(2, 'moreinformation');
            &lt;/SCRIPT&gt;
데스크톱의 프로세스 열거 작업과 최상위 창 열거 작업을 비교해 보면 최상위 창 열거 작업이 좀더 간단합니다. 최상위 창을 열거하려면 &lt;B&gt;EnumWindows()&lt;/B&gt; 함수를 사용하십시오. z축 변경 및 손실 창으로 인해 혼동될 수 있으므로 &lt;B&gt;GetWindow()&lt;/B&gt;를 사용하여 창 목록을 만들지 마십시오.&lt;BR&gt;&lt;BR&gt;&lt;B&gt;EnumWindows()&lt;/B&gt;는 콜백 함수에 대한 포인터와 사용자 정의 &lt;I&gt;LPARAM&lt;/I&gt; 값을 매개 변수로 사용하며, 데스크톱에서 실행 중인 각 창(또는 최상위 창)에 대해 콜백 함수를 호출합니다. 그러면 콜백 함수는 해당 창 핸들을 사용하여 창을 목록에 추가하는 등의 작업을 처리할 수 있습니다. 이 방법을 사용하면 창의 z축 변경 등으로 인해 혼동되지 않습니다. 창 핸들을 얻으면 &lt;B&gt;GetWindowText()&lt;/B&gt;를 호출하여 제목을 가져올 수 있습니다. 
&lt;DIV class=topOfPage&gt;&lt;A href=&quot;http://support.microsoft.com/kb/175030/ko#top&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/uparrow.gif&quot;&gt;&lt;FONT color=#800080&gt;위로 가기&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;
&lt;H3 id=tocHeadRef&gt;프로세스 열거&lt;/H3&gt;
&lt;SCRIPT type=text/javascript&gt;
                loadTOCNode(2, 'moreinformation');
            &lt;/SCRIPT&gt;
시스템의 프로세스 목록을 만드는 작업은 창 열거 작업보다 약간 복잡합니다. 주로 그 이유는 사용하는 Win32 운영 체제에 따라 이 작업을 수행하는 API 함수가 달라지기 때문입니다. Windows 95, Windows 98, Windows Millennium Edition, Windows 2000 및 Windows XP에서는 API의 ToolHelp32 라이브러리에 있는 함수를 사용할 수 있지만, Windows NT에서는 Platform SDK에서 제공하는 API의 PSAPI 라이브러리에 있는 함수를 사용해야 합니다. 이 문서에서는 이러한 두 가지 방법을 모두 설명하며 모든 Win32 운영 체제에서 작동하는 &lt;B&gt;EnumProcs()&lt;/B&gt;라는 예제 래퍼 함수도 제공합니다. 
&lt;DIV class=topOfPage&gt;&lt;A href=&quot;http://support.microsoft.com/kb/175030/ko#top&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/uparrow.gif&quot;&gt;&lt;FONT color=#800080&gt;위로 가기&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;
&lt;H3 id=tocHeadRef&gt;ToolHelp32 라이브러리를 사용하여 프로세스 열거&lt;/H3&gt;
&lt;SCRIPT type=text/javascript&gt;
                loadTOCNode(2, 'moreinformation');
            &lt;/SCRIPT&gt;
먼저 ToolHelp32 방법을 살펴봅니다. KERNEL32.dll에 있는 ToolHelp32 함수는 표준 API 함수입니다. 이러한 API는 Windows NT 4.0에서 사용할 수 없습니다.&lt;BR&gt;&lt;BR&gt;ToolHelp32는 시스템의 프로세스와 스레드를 열거할 뿐 아니라 메모리와 모듈 정보를 얻을 수 있는 다양한 함수를 제공합니다. 그러나 프로세스를 열거할 때는 &lt;B&gt;CreateToolhelp32Snapshot()&lt;/B&gt;, &lt;B&gt;Process32First()&lt;/B&gt;, &lt;B&gt;Process32Next()&lt;/B&gt; 등의 세 함수만 필요합니다.&lt;BR&gt;&lt;BR&gt;ToolHelp32 함수를 사용하는 첫 번째 단계는 시스템 정보에 대한 &quot;스냅샷&quot;을 만드는 것입니다. 스냅샷은 &lt;B&gt;CreateToolhelp32Snapshot()&lt;/B&gt; 함수를 사용하여 만듭니다. 이 함수를 사용하면 스냅샷에 저장되는 정보의 종류를 선택할 수 있습니다. 프로세스 정보를 저장하려면 &lt;I&gt;TH32CS_SNAPPROCESS&lt;/I&gt; 플래그를 포함시켜야 합니다. &lt;B&gt;CreateToolhelp32Snapshot()&lt;/B&gt; 함수는 완료되면, &lt;B&gt;CloseHandle()&lt;/B&gt;에 전달되어야 하는 핸들을 반환합니다.&lt;BR&gt;&lt;BR&gt;스냅샷을 만든 후 이 스냅샷에서 프로세스 목록을 검색하려면 &lt;B&gt;Process32First&lt;/B&gt;를 한 번 호출한 다음 &lt;B&gt;Process32Next&lt;/B&gt;를 반복 호출합니다. 이러한 함수 중 하나가 FALSE를 반환할 때까지 이 작업을 계속합니다. 이 작업은 스냅샷에 있는 프로세스 목록 전체에 반복됩니다. 이러한 두 함수는 모두 스냅샷에 대한 핸들과 PROCESSENTRY32 구조에 대한 포인터를 매개 변수로 사용합니다.&lt;BR&gt;&lt;BR&gt;&lt;B&gt;Process32First&lt;/B&gt; 또는 &lt;B&gt;Process32Next&lt;/B&gt;를 호출하면 PROCESSENTRY32 구조에는 시스템 프로세스 중 하나에 대한 유용한 정보가 포함됩니다. 프로세스 ID는 PROCESSENTRY32 구조의 th32ProcessID 구성원에 있습니다. 이것을 &lt;B&gt;OpenProcess()&lt;/B&gt; API에 전달하여 프로세스에 대한 핸들을 얻을 수 있습니다. 실행 파일 및 프로세스 경로는 PROCESSENTRY32 구조의 szExeFile 구성원에 저장됩니다. 이 구조에는 다른 유용한 정보도 들어 있습니다.&lt;BR&gt;&lt;BR&gt;&lt;B&gt;참고:&lt;/B&gt;&lt;B&gt;Process32First()&lt;/B&gt;를 호출하기 전에 PROCESSENTRY32 구조의 dwSize 구성원을 &lt;I&gt;sizeof(PROCESSENTRY32)&lt;/I&gt;로 설정하는 것이 중요합니다. 
&lt;DIV class=topOfPage&gt;&lt;A href=&quot;http://support.microsoft.com/kb/175030/ko#top&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/uparrow.gif&quot;&gt;&lt;FONT color=#800080&gt;위로 가기&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;
&lt;H3 id=tocHeadRef&gt;PSAPI 라이브러리를 사용하여 프로세스 열거&lt;/H3&gt;
&lt;SCRIPT type=text/javascript&gt;
                loadTOCNode(2, 'moreinformation');
            &lt;/SCRIPT&gt;
Windows NT에서 프로세스 목록을 만들려면 PSAPI.dll에 있는 PSAPI 함수를 사용해야 합니다. 이 파일은 다음 Microsoft 웹 사이트에서 다운로드할 수 있는 플랫폼 Platform SDK와 함께 배포됩니다. 
&lt;DIV class=indent&gt;Microsoft Platform SDK&lt;BR&gt;&lt;A href=&quot;http://www.microsoft.com/msdownload/platformsdk/sdkupdate/&quot; target=&quot;_blank&quot;&gt;&lt;FONT color=#0000ff&gt;http://www.microsoft.com/msdownload/platformsdk/sdkupdate/&lt;/FONT&gt;&lt;/A&gt;&lt;SPAN class=pLink&gt; (http://www.microsoft.com/msdownload/platformsdk/sdkupdate/) &lt;/SPAN&gt;&lt;/DIV&gt;Platform SDK에는 필요한 PSAPI.h와 PSAPI.lib 파일도 포함되어 있습니다.&lt;BR&gt;&lt;BR&gt;PSAPI 라이브러리에 있는 함수를 사용하려면 PSAPI.lib 파일을 프로젝트에 추가하고 PSAPI API를 호출하는 모듈에 PSAPI.h 파일을 포함합니다. Windows NT 4.0에는 PSAPI.dll 파일을 사용하는 실행 파일이 배포되지 않으므로 반드시 PSAPI.dll 파일과 함께 실행 파일을 배포하십시오. 재배포 가능한 버전의 PSAPI.dll(전체 Platform SDK 제외)은 다음 위치에서 다운로드할 수 있습니다. 
&lt;DIV class=indent&gt;Platform SDK Redistributable: PSAPI for Windows NT&lt;BR&gt;&lt;A href=&quot;http://www.microsoft.com/downloads/release.asp?releaseid=30337&quot; target=&quot;_blank&quot;&gt;&lt;FONT color=#0000ff&gt;http://www.microsoft.com/downloads/release.asp?releaseid=30337&lt;/FONT&gt;&lt;/A&gt;&lt;SPAN class=pLink&gt; (http://www.microsoft.com/downloads/release.asp?releaseid=3 0337) &lt;/SPAN&gt;&lt;/DIV&gt;ToolHelp32 함수와 마찬가지로 PSAPI 라이브러리에도 기타 유용한 함수가 많이 포함되어 있습니다. 그러나 이 문서에서는 &lt;B&gt;EnumProcesses()&lt;/B&gt;, &lt;B&gt;EnumProcessModules()&lt;/B&gt;, &lt;B&gt;GetModuleFileNameEx()&lt;/B&gt;, &lt;B&gt;GetModuleBaseName()&lt;/B&gt; 등 프로세스 열거 관련 함수만 설명합니다.&lt;BR&gt;&lt;BR&gt;프로세스 목록을 만드는 첫 번째 단계는 &lt;B&gt;EnumProcesses()&lt;/B&gt;를 호출하는 것입니다. 다음과 같이 선언합니다. 
&lt;DIV class=kb_codebody&gt;
&lt;DIV class=kb_codecontent&gt;&lt;CODE&gt;&lt;PRE class=code&gt;BOOL EnumProcesses( DWORD *lpidProcess, DWORD cb, DWORD *cbNeeded );
				&lt;/PRE&gt;&lt;/CODE&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;B&gt;EnumProcesses()&lt;/B&gt;는 DWORD 배열에 대한 포인터(lpidProcess), 배열의 크기(&lt;I&gt;cb&lt;/I&gt;) 및 반환된 데이터의 길이를 받는 DWORD에 대한 포인터(&lt;I&gt;cbNeeded&lt;/I&gt;)를 매개 변수로 사용합니다. DWORD 배열은 현재 실행 중인 프로세스에 대한 프로세스 ID의 배열로 채워집니다. &lt;I&gt;cbNeeded&lt;/I&gt; 매개 변수는 사용되는 배열의 크기를 반환합니다. nReturned = cbNeeded / sizeof(DWORD)는 얼마나 많은 프로세스 ID가 반환되었는지 계산합니다.&lt;BR&gt;&lt;BR&gt;&lt;B&gt;참고:&lt;/B&gt; 이 문서에서는 반환된 DWORD &quot;cbNeeded&quot;라고 지정하지만 실제로 어느 정도 크기의 배열이 전달되어야 하는지 확인할 방법은 없습니다. &lt;B&gt;EnumProcesses()&lt;/B&gt;는 &lt;I&gt;cb&lt;/I&gt; 매개 변수에 전달된 배열 값보다 큰 &lt;I&gt;cbNeeded&lt;/I&gt; 값을 반환하지 않습니다. 따라서 &lt;B&gt;EnumProcesses()&lt;/B&gt; 함수를 성공적으로 사용하는 유일한 방법은 DWORD 배열을 할당하고, 반환 시 &lt;I&gt;cbNeeded&lt;/I&gt;가 &lt;I&gt;cb&lt;/I&gt;와 같으면 더 큰 배열을 할당하여 &lt;I&gt;cbNeeded&lt;/I&gt;가 &lt;I&gt;cb&lt;/I&gt;보다 작아질 때까지 다시 시도하는 것입니다.&lt;BR&gt;&lt;BR&gt;이제 시스템의 각 프로세스 ID가 포함된 배열이 만들어집니다. 프로세스 이름을 아는 것이 목적이라면 먼저 핸들을 얻어야 합니다. 프로세스 ID에서 핸들을 얻으려면 &lt;B&gt;OpenProcess()&lt;/B&gt;를 사용하십시오.&lt;BR&gt;&lt;BR&gt;핸들을 얻은 후에는 프로세스의 첫 번째 모듈을 얻어야 합니다. 프로세스의 첫 번째 모듈을 얻으려면 다음 매개 변수를 사용하여 &lt;B&gt;EnumProcessModules()&lt;/B&gt; API를 호출하십시오. 
&lt;DIV class=kb_codebody&gt;
&lt;DIV class=kb_codecontent&gt;&lt;CODE&gt;&lt;PRE class=code&gt;EnumProcessModules( hProcess, &amp;hModule, sizeof(hModule), &amp;cbReturned );
				&lt;/PRE&gt;&lt;/CODE&gt;&lt;/DIV&gt;&lt;/DIV&gt;이 함수는 hModule 변수에 프로세스의 첫 번째 모듈에 대한 핸들을 저장합니다. 실제로 프로세스에는 이름이 없지만 프로세스의 첫 번째 모듈이 프로세스의 실행 파일이 됩니다. 이제 반환된 모듈 핸들(hModule)을 &lt;B&gt;GetModuleFileNameEx()&lt;/B&gt; 또는 &lt;B&gt;GetModuleBaseName()&lt;/B&gt; API에서 사용하여 전체 파일 경로 이름이나 프로세스 실행 파일의 간단한 모듈 이름을 얻을 수 있습니다. 두 함수 모두 프로세스에 대한 핸들, 모듈에 대한 핸들, 이름을 반환하는 버퍼 포인터와 버퍼 크기를 매개 변수로 사용합니다.&lt;BR&gt;&lt;BR&gt;&lt;B&gt;EnumProcesses()&lt;/B&gt; API를 통해 반환된 각 프로세스 ID에 대해 이 단계를 반복하면 Windows NT의 프로세스 목록이 만들어집니다. 
&lt;DIV class=topOfPage&gt;&lt;A href=&quot;http://support.microsoft.com/kb/175030/ko#top&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/uparrow.gif&quot;&gt;&lt;FONT color=#800080&gt;위로 가기&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;
&lt;H3 id=tocHeadRef&gt;16비트 프로세스&lt;/H3&gt;
&lt;SCRIPT type=text/javascript&gt;
                loadTOCNode(2, 'moreinformation');
            &lt;/SCRIPT&gt;
Windows 95, Windows 98 및 Windows Millennium Edition에서는 16비트 응용 프로그램을 Win32 응용 프로그램에서처럼 ToolHelp32를 사용하여 열거할 수 있습니다. 16비트 응용 프로그램에도 Win32 응용 프로그램과 마찬가지로 프로세스 ID 등이 있습니다. 그러나 Windows NT, Windows 2000 또는 Windows XP 운영 체제에서는 경우가 다릅니다. 이러한 운영 체제에서는 16비트 응용 프로그램이 VDM(Virtual Dos Machine)에서 실행됩니다.&lt;BR&gt;&lt;BR&gt;따라서 Windows NT, Windows 2000 및 Windows XP에서 16비트 응용 프로그램을 열거하려면 &lt;B&gt;VDMEnumTaskWOWEx()&lt;/B&gt;라는 함수를 사용해야 합니다. 원본 모듈에 VDMDBG.h를 포함해야 하며 VDMDBG.lib 파일을 사용자 프로젝트와 연결해야 합니다. 이 두 파일은 Platform SDK에 포함되어 있습니다.&lt;BR&gt;&lt;BR&gt;이 함수의 선언은 다음과 같습니다. 
&lt;DIV class=kb_codebody&gt;
&lt;DIV class=kb_codecontent&gt;&lt;CODE&gt;&lt;PRE class=code&gt;INT WINAPI VDMEnumTaskWOWEx( DWORD dwProcessId, TASKENUMPROCEX fp,
                                LPARAM lparam );
				&lt;/PRE&gt;&lt;/CODE&gt;&lt;/DIV&gt;&lt;/DIV&gt;여기서 dwProcessId는 열거할 16비트 작업의 NTVDM 프로세스에 대한 식별자입니다. &lt;I&gt;fp&lt;/I&gt; 매개 변수는 콜백 열거 함수에 대한 포인터이며, &lt;I&gt;lparam&lt;/I&gt; 매개 변수는 열거 함수에 전달될 사용자 정의 값입니다.&lt;BR&gt;&lt;BR&gt;열거 함수는 다음과 같이 정의해야 합니다. 
&lt;DIV class=kb_codebody&gt;
&lt;DIV class=kb_codecontent&gt;&lt;CODE&gt;&lt;PRE class=code&gt;BOOL WINAPI Enum16( DWORD dwThreadId, WORD hMod16, WORD hTask16, PSZ
                       pszModName, PSZ pszFileName, LPARAM lpUserDefined );
				&lt;/PRE&gt;&lt;/CODE&gt;&lt;/DIV&gt;&lt;/DIV&gt;이 함수는 &lt;B&gt;VDMEnumTaskWOWEx()&lt;/B&gt;에 전달되며 NTVDM 프로세스에서 실행 중인 각 16비트 작업에 대해 한 번 호출됩니다. 열거를 계속하려면 FALSE를, 열거를 끝내려면 TRUE를 반환해야 합니다. 이것은 &lt;B&gt;EnumWindows()&lt;/B&gt;와 반대입니다. 
&lt;DIV class=topOfPage&gt;&lt;A href=&quot;http://support.microsoft.com/kb/175030/ko#top&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/uparrow.gif&quot;&gt;&lt;FONT color=#800080&gt;위로 가기&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;
&lt;H3 id=tocHeadRef&gt;예제 코드&lt;/H3&gt;
&lt;SCRIPT type=text/javascript&gt;
                loadTOCNode(2, 'moreinformation');
            &lt;/SCRIPT&gt;
다음 예제 코드는 PSAPI 및 ToolHelp32 함수를 &lt;B&gt;EnumProcs()&lt;/B&gt;라는 한 함수로 캡슐화합니다. 이 함수는 함수에 대한 포인터를 사용하고 이것을 반복적으로 호출한다는 점에서 &lt;B&gt;EnumWindows()&lt;/B&gt;와 비슷하며, 시스템에 있는 각 프로세스에 대해 한 번 작동합니다. 이 함수의 선언은 다음과 같습니다. 
&lt;DIV class=kb_codebody&gt;
&lt;DIV class=kb_codecontent&gt;&lt;CODE&gt;&lt;PRE class=code&gt;BOOL WINAPI EnumProcs( PROCENUMPROC lpProc, LPARAM lParam );
				&lt;/PRE&gt;&lt;/CODE&gt;&lt;/DIV&gt;&lt;/DIV&gt;이 함수를 사용하는 경우 콜백 함수는 다음과 같이 선언하십시오. 
&lt;DIV class=kb_codebody&gt;
&lt;DIV class=kb_codecontent&gt;&lt;CODE&gt;&lt;PRE class=code&gt;BOOL CALLBACK Proc( DWORD dw, WORD w16, LPCSTR lpstr, LPARAM lParam );
				&lt;/PRE&gt;&lt;/CODE&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;I&gt;dw&lt;/I&gt; 매개 변수는 ID를 포함하게 되고, 32비트 프로세스인 경우 &quot;w16&quot;은 16비트 작업 번호나 0(Windows 95에서는 항상 0)이고, &lt;I&gt;lpstr&lt;/I&gt; 매개 변수는 해당 파일 이름을 가리키며, &lt;I&gt;lParam&lt;/I&gt;은 &lt;B&gt;EnumProcs()&lt;/B&gt;에 전달되는 사용자 정의 &lt;I&gt;lParam&lt;/I&gt;입니다.&lt;BR&gt;&lt;BR&gt;&lt;B&gt;EnumProcs()&lt;/B&gt; 함수는 보다 일반적인 암시적 연결 대신 명시적 연결을 통해 ToolHelp32 및 PSAPI 함수를 사용합니다. 이 방법을 사용하면 모든 Win32 운영 체제에서 코드가 이진 호환됩니다. 
&lt;DIV class=kb_codebody&gt;
&lt;DIV class=kb_codecontent&gt;&lt;CODE&gt;&lt;PRE class=code&gt;// 
// EnumProc.c
// 
#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;tlhelp32.h&gt;
#include &lt;vdmdbg.h&gt;

typedef BOOL (CALLBACK *PROCENUMPROC)(DWORD, WORD, LPSTR, LPARAM);

typedef struct {
   DWORD          dwPID;
   PROCENUMPROC   lpProc;
   DWORD          lParam;
   BOOL           bEnd;
} EnumInfoStruct;

BOOL WINAPI EnumProcs(PROCENUMPROC lpProc, LPARAM lParam);

BOOL WINAPI Enum16(DWORD dwThreadId, WORD hMod16, WORD hTask16,
      PSZ pszModName, PSZ pszFileName, LPARAM lpUserDefined);

// 
// The EnumProcs function takes a pointer to a callback function
// that will be called once per process with the process filename 
// and process ID.
// 
// lpProc -- Address of callback routine.
// 
// lParam -- A user-defined LPARAM value to be passed to
//           the callback routine.
// 
// Callback function definition:
// BOOL CALLBACK Proc(DWORD dw, WORD w, LPCSTR lpstr, LPARAM lParam);
// 
BOOL WINAPI EnumProcs(PROCENUMPROC lpProc, LPARAM lParam) {

   OSVERSIONINFO  osver;
   HINSTANCE      hInstLib  = NULL;
   HINSTANCE      hInstLib2 = NULL;
   HANDLE         hSnapShot = NULL;
   LPDWORD        lpdwPIDs  = NULL;
   PROCESSENTRY32 procentry;
   BOOL           bFlag;
   DWORD          dwSize;
   DWORD          dwSize2;
   DWORD          dwIndex;
   HMODULE        hMod;
   HANDLE         hProcess;
   char           szFileName[MAX_PATH];
   EnumInfoStruct sInfo;

   // ToolHelp Function Pointers.
   HANDLE (WINAPI *lpfCreateToolhelp32Snapshot)(DWORD, DWORD);
   BOOL (WINAPI *lpfProcess32First)(HANDLE, LPPROCESSENTRY32);
   BOOL (WINAPI *lpfProcess32Next)(HANDLE, LPPROCESSENTRY32);

   // PSAPI Function Pointers.
   BOOL (WINAPI *lpfEnumProcesses)(DWORD *, DWORD, DWORD *);
   BOOL (WINAPI *lpfEnumProcessModules)(HANDLE, HMODULE *, DWORD, 
         LPDWORD);
   DWORD (WINAPI *lpfGetModuleBaseName)(HANDLE, HMODULE, LPTSTR, DWORD);

   // VDMDBG Function Pointers.
   INT (WINAPI *lpfVDMEnumTaskWOWEx)(DWORD, TASKENUMPROCEX, LPARAM);

   // Retrieve the OS version
   osver.dwOSVersionInfoSize = sizeof(osver);
   if (!GetVersionEx(&amp;osver))
      return FALSE;
   
   // If Windows NT 4.0
   if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT
         &amp;&amp; osver.dwMajorVersion == 4) {

      __try {

         // Get the procedure addresses explicitly. We do
         // this so we don't have to worry about modules
         // failing to load under OSes other than Windows NT 4.0 
         // because references to PSAPI.DLL can't be resolved.
         hInstLib = LoadLibraryA(&quot;PSAPI.DLL&quot;);
         if (hInstLib == NULL)
            __leave;

         hInstLib2 = LoadLibraryA(&quot;VDMDBG.DLL&quot;);
         if (hInstLib2 == NULL)
            __leave;

         // Get procedure addresses.
         lpfEnumProcesses = (BOOL (WINAPI *)(DWORD *, DWORD, DWORD*))
               GetProcAddress(hInstLib, &quot;EnumProcesses&quot;);

         lpfEnumProcessModules = (BOOL (WINAPI *)(HANDLE, HMODULE *,
               DWORD, LPDWORD)) GetProcAddress(hInstLib,
               &quot;EnumProcessModules&quot;);

         lpfGetModuleBaseName = (DWORD (WINAPI *)(HANDLE, HMODULE,
               LPTSTR, DWORD)) GetProcAddress(hInstLib,
               &quot;GetModuleBaseNameA&quot;);

         lpfVDMEnumTaskWOWEx = (INT (WINAPI *)(DWORD, TASKENUMPROCEX,
               LPARAM)) GetProcAddress(hInstLib2, &quot;VDMEnumTaskWOWEx&quot;);
         
         if (lpfEnumProcesses == NULL 
               || lpfEnumProcessModules == NULL 
               || lpfGetModuleBaseName == NULL 
               || lpfVDMEnumTaskWOWEx == NULL)
            __leave;

         // 
         // Call the PSAPI function EnumProcesses to get all of the
         // ProcID's currently in the system.
         // 
         // NOTE: In the documentation, the third parameter of
         // EnumProcesses is named cbNeeded, which implies that you
         // can call the function once to find out how much space to
         // allocate for a buffer and again to fill the buffer.
         // This is not the case. The cbNeeded parameter returns
         // the number of PIDs returned, so if your buffer size is
         // zero cbNeeded returns zero.
         // 
         // NOTE: The &quot;HeapAlloc&quot; loop here ensures that we
         // actually allocate a buffer large enough for all the
         // PIDs in the system.
         // 
         dwSize2 = 256 * sizeof(DWORD);
         do {

            if (lpdwPIDs) {
               HeapFree(GetProcessHeap(), 0, lpdwPIDs);
               dwSize2 *= 2;
            }

            lpdwPIDs = (LPDWORD) HeapAlloc(GetProcessHeap(), 0, 
                  dwSize2);
            if (lpdwPIDs == NULL)
               __leave;
            
            if (!lpfEnumProcesses(lpdwPIDs, dwSize2, &amp;dwSize))
               __leave;

         } while (dwSize == dwSize2);

         // How many ProcID's did we get?
         dwSize /= sizeof(DWORD);

         // Loop through each ProcID.
         for (dwIndex = 0; dwIndex &lt; dwSize; dwIndex++) {

            szFileName[0] = 0;
            
            // Open the process (if we can... security does not
            // permit every process in the system to be opened).
            hProcess = OpenProcess(
                  PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
                  FALSE, lpdwPIDs[dwIndex]);
            if (hProcess != NULL) {

               // Here we call EnumProcessModules to get only the
               // first module in the process. This will be the 
               // EXE module for which we will retrieve the name.
               if (lpfEnumProcessModules(hProcess, &amp;hMod,
                     sizeof(hMod), &amp;dwSize2)) {

                  // Get the module name
                  if (!lpfGetModuleBaseName(hProcess, hMod,
                        szFileName, sizeof(szFileName)))
                     szFileName[0] = 0;
               }
               CloseHandle(hProcess);
            }
            // Regardless of OpenProcess success or failure, we
            // still call the enum func with the ProcID.
            if (!lpProc(lpdwPIDs[dwIndex], 0, szFileName, lParam))
               break;

            // Did we just bump into an NTVDM?
            if (_stricmp(szFileName, &quot;NTVDM.EXE&quot;) == 0) {

               // Fill in some info for the 16-bit enum proc.
               sInfo.dwPID = lpdwPIDs[dwIndex];
               sInfo.lpProc = lpProc;
               sInfo.lParam = (DWORD) lParam;
               sInfo.bEnd = FALSE;

               // Enum the 16-bit stuff.
               lpfVDMEnumTaskWOWEx(lpdwPIDs[dwIndex],
                  (TASKENUMPROCEX) Enum16, (LPARAM) &amp;sInfo);

               // Did our main enum func say quit?
               if (sInfo.bEnd)
                  break;
            }
         }

      } __finally {

         if (hInstLib)
            FreeLibrary(hInstLib);

         if (hInstLib2)
            FreeLibrary(hInstLib2);

         if (lpdwPIDs)
            HeapFree(GetProcessHeap(), 0, lpdwPIDs);
      }

   // If any OS other than Windows NT 4.0.
   } else if (osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS
         || (osver.dwPlatformId == VER_PLATFORM_WIN32_NT
         &amp;&amp; osver.dwMajorVersion &gt; 4)) {

      __try {

         hInstLib = LoadLibraryA(&quot;Kernel32.DLL&quot;);
         if (hInstLib == NULL)
            __leave;

         // If NT-based OS, load VDMDBG.DLL.
         if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) {
            hInstLib2 = LoadLibraryA(&quot;VDMDBG.DLL&quot;);
            if (hInstLib2 == NULL)
               __leave;
         }

         // Get procedure addresses. We are linking to 
         // these functions explicitly, because a module using
         // this code would fail to load under Windows NT,
         // which does not have the Toolhelp32
         // functions in KERNEL32.DLL.
         lpfCreateToolhelp32Snapshot =
               (HANDLE (WINAPI *)(DWORD,DWORD))
               GetProcAddress(hInstLib, &quot;CreateToolhelp32Snapshot&quot;);

         lpfProcess32First =
               (BOOL (WINAPI *)(HANDLE,LPPROCESSENTRY32))
               GetProcAddress(hInstLib, &quot;Process32First&quot;);

         lpfProcess32Next =
               (BOOL (WINAPI *)(HANDLE,LPPROCESSENTRY32))
               GetProcAddress(hInstLib, &quot;Process32Next&quot;);

         if (lpfProcess32Next == NULL
               || lpfProcess32First == NULL
               || lpfCreateToolhelp32Snapshot == NULL)
            __leave;

         if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) {
            lpfVDMEnumTaskWOWEx = (INT (WINAPI *)(DWORD, TASKENUMPROCEX,
                  LPARAM)) GetProcAddress(hInstLib2, &quot;VDMEnumTaskWOWEx&quot;);
            if (lpfVDMEnumTaskWOWEx == NULL)
               __leave;
         }

         // Get a handle to a Toolhelp snapshot of all processes.
         hSnapShot = lpfCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
         if (hSnapShot == INVALID_HANDLE_VALUE) {
            FreeLibrary(hInstLib);
            return FALSE;
         }

         // Get the first process' information.
         procentry.dwSize = sizeof(PROCESSENTRY32);
         bFlag = lpfProcess32First(hSnapShot, &amp;procentry);

         // While there are processes, keep looping.
         while (bFlag) {
            
            // Call the enum func with the filename and ProcID.
            if (lpProc(procentry.th32ProcessID, 0,
                  procentry.szExeFile, lParam)) {

               // Did we just bump into an NTVDM?
               if (_stricmp(procentry.szExeFile, &quot;NTVDM.EXE&quot;) == 0) {

                  // Fill in some info for the 16-bit enum proc.
                  sInfo.dwPID = procentry.th32ProcessID;
                  sInfo.lpProc = lpProc;
                  sInfo.lParam = (DWORD) lParam;
                  sInfo.bEnd = FALSE;

                  // Enum the 16-bit stuff.
                  lpfVDMEnumTaskWOWEx(procentry.th32ProcessID,
                     (TASKENUMPROCEX) Enum16, (LPARAM) &amp;sInfo);

                  // Did our main enum func say quit?
                  if (sInfo.bEnd)
                     break;
               }

               procentry.dwSize = sizeof(PROCESSENTRY32);
               bFlag = lpfProcess32Next(hSnapShot, &amp;procentry);

            } else
               bFlag = FALSE;
         }

      } __finally {

         if (hInstLib)
            FreeLibrary(hInstLib);

         if (hInstLib2)
            FreeLibrary(hInstLib2);
      }

   } else
      return FALSE;

   // Free the library.
   FreeLibrary(hInstLib);

   return TRUE;
}


BOOL WINAPI Enum16(DWORD dwThreadId, WORD hMod16, WORD hTask16,
      PSZ pszModName, PSZ pszFileName, LPARAM lpUserDefined) {

   BOOL bRet;

   EnumInfoStruct *psInfo = (EnumInfoStruct *)lpUserDefined;

   bRet = psInfo-&gt;lpProc(psInfo-&gt;dwPID, hTask16, pszFileName,
      psInfo-&gt;lParam);

   if (!bRet) 
      psInfo-&gt;bEnd = TRUE;

   return !bRet;
} 


BOOL CALLBACK MyProcessEnumerator(DWORD dwPID, WORD wTask, 
      LPCSTR szProcess, LPARAM lParam) {

   if (wTask == 0)
      printf(&quot;%5u   %s\n&quot;, dwPID, szProcess);
   else
      printf(&quot;  %5u %s\n&quot;, wTask, szProcess);

   return TRUE;
}


void main() {
   EnumProcs((PROCENUMPROC) MyProcessEnumerator, 0);
}
				&lt;/PRE&gt;&lt;/CODE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=topOfPage&gt;&lt;A href=&quot;http://support.microsoft.com/kb/175030/ko#top&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/uparrow.gif&quot;&gt;&lt;FONT color=#800080&gt;위로 가기&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;H2 class=subTitle id=tocHeadRef&gt;
&lt;DIV class=&quot;kb_tabs_toggle kb_tabs_toggle_open&quot;&gt;&lt;FONT color=#800080&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;SPAN&gt;&lt;A href=&quot;javascript:void(0);&quot;&gt;&lt;FONT color=#0000ff&gt;참조&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt; 
&lt;DIV class=sectionpreview_closed&gt;Pietrek, Matt의 Microsoft Systems Journal, no. 8, &quot;Under the Hood&quot;(1996년 8월) Piet...&lt;/DIV&gt;&lt;/H2&gt;
&lt;SCRIPT type=text/javascript&gt;
                            loadTOCNode(1, 'references');
                        &lt;/SCRIPT&gt;

&lt;DIV class=sbody style=&quot;MARGIN-LEFT: 195px&quot;&gt;Pietrek, Matt의 &lt;I&gt;Microsoft Systems Journal&lt;/I&gt;, no. 8, &quot;Under the Hood&quot;(1996년 8월) &lt;BR&gt;&lt;BR&gt;Pietrek, Matt의 &lt;I&gt;Microsoft Systems Journal&lt;/I&gt;, no. 11, &quot;Under the Hood&quot;(1996년 11월) &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;B&gt;Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 &lt;A href=&quot;http://support.microsoft.com/newsgroups/default.aspx&quot; target=&quot;_blank&quot;&gt;&lt;FONT color=#0000ff&gt;Microsoft 뉴스 그룹&lt;/FONT&gt;&lt;/A&gt;&lt;SPAN class=pLink&gt; (http://support.microsoft.com/newsgroups/default.aspx) &lt;/SPAN&gt;에 참여하시기 바랍니다.&lt;/B&gt; 
&lt;DIV class=topOfPage&gt;&lt;A href=&quot;http://support.microsoft.com/kb/175030/ko#top&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/uparrow.gif&quot;&gt;&lt;FONT color=#800080&gt;위로 가기&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;sbody norollup&quot; style=&quot;MARGIN-LEFT: 195px&quot;&gt;
&lt;DIV class=appliesTo&gt;&lt;FONT color=#800080&gt;
&lt;HR&gt;
&lt;/FONT&gt;&lt;A id=appliesto&gt;&lt;/A&gt;
&lt;H5&gt;본 문서의 정보는 다음의 제품에 적용됩니다.&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Microsoft Win32 Application Programming Interface&amp;nbsp;을(를) 다음과 함께 사용했을 때 
&lt;UL class=kb_subList&gt;
&lt;LI&gt;Microsoft Windows 95 
&lt;LI&gt;Microsoft Windows 98 Standard Edition 
&lt;LI&gt;Microsoft Windows Millennium Edition 
&lt;LI&gt;Microsoft Windows NT 4.0 
&lt;LI&gt;Microsoft Windows 2000 Standard Edition 
&lt;LI&gt;Microsoft Windows XP Professional&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/DIV&gt;
&lt;DIV class=topOfPage&gt;&lt;A href=&quot;http://support.microsoft.com/kb/175030/ko#top&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/uparrow.gif&quot;&gt;&lt;FONT color=#800080&gt;위로 가기&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;
&lt;DIV class=keywords&gt;
&lt;TABLE&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=header&gt;
&lt;H5&gt;키워드:&amp;nbsp; &lt;/H5&gt;&lt;/TD&gt;
&lt;TD class=text&gt;kbhowto kbthread kbkernbase KB175030&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;DIV class=topOfPage&gt;&lt;A href=&quot;http://support.microsoft.com/kb/175030/ko#top&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/kbgraphics/public/en-us/uparrow.gif&quot;&gt;&lt;FONT color=#800080&gt;위로 가기&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;!-- - -KB 3 end- - --&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;SPAN class=bookmark&gt;&lt;A id=survey name=survey&gt;&amp;nbsp;&lt;/A&gt;&lt;/SPAN&gt; 
&lt;DIV class=wp id=fmsSurvey style=&quot;DISPLAY: block&quot;&gt;
&lt;DIV class=fms&gt;&lt;NOSCRIPT&gt;&lt;div class=&quot;SURVEYNOSCRIPT&quot;&gt;&lt;/div&gt;&lt;/NOSCRIPT&gt;&lt;INPUT id=surveyname type=hidden name=surveyname&gt;&lt;INPUT id=showpage type=hidden value=1 name=showpage&gt; 
&lt;DIV id=SURVEYSECTIONCONTAINER&gt;
&lt;DIV class=SURVEYSECTION id=SURVEYSECTION_1 style=&quot;DISPLAY: block&quot; xmlns:sw=&quot;urn:schemas-microsoft-com/PSS/PSS_Survey01&quot;&gt;&lt;INPUT type=hidden value=1 name=id&gt;&lt;INPUT type=hidden name=CompoundingBranchRules&gt;&lt;INPUT type=hidden name=NextSectionByTopicRef&gt; 
&lt;DIV class=QUESTIONCONTAINER id=SURVEYQUESTION_7825&gt;&lt;INPUT type=hidden value=7825 name=id&gt;&lt;INPUT type=hidden value=LABEL name=type&gt;&lt;INPUT type=hidden value=0 name=required&gt; 
&lt;DIV class=QUESTIONTEXT&gt;
&lt;H5&gt;이 문서에 대한 의견 보내기&lt;/H5&gt;&lt;/DIV&gt;
&lt;DIV class=QUESTIONINSTRUCTION&gt;&lt;/DIV&gt;
&lt;DIV class=QUESTIONREQUIRED&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=QUESTIONCONTAINER id=SURVEYQUESTION_7826&gt;&lt;INPUT type=hidden value=7826 name=id&gt;&lt;INPUT type=hidden value=CHOICE name=type&gt;&lt;INPUT type=hidden value=0 name=required&gt; 
&lt;DIV class=QUESTIONTEXT&gt;이 문서가 문제를 해결하는 데 도움이 되었습니까?&lt;/DIV&gt;
&lt;DIV class=QUESTIONINSTRUCTION&gt;&lt;/DIV&gt;
&lt;DIV class=QUESTIONREQUIRED&gt;&lt;/DIV&gt;&lt;INPUT type=hidden name=randomization&gt; 
&lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;
&lt;TBODY&gt;
&lt;TR style=&quot;DISPLAY: block&quot;&gt;
&lt;TD style=&quot;DISPLAY: block&quot; vAlign=top&gt;
&lt;TABLE cellSpacing=2 cellPadding=0 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top&gt;&lt;INPUT id=8167 type=radio value=0 name=QUESTION_1_78267826 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD class=ANSWERTEXT&gt;예&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;DISPLAY: block&quot;&gt;
&lt;TD style=&quot;DISPLAY: block&quot; vAlign=top&gt;
&lt;TABLE cellSpacing=2 cellPadding=0 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top&gt;&lt;INPUT id=13111 type=radio value=0 name=QUESTION_1_78267826 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD class=ANSWERTEXT&gt;아니요&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;DISPLAY: block&quot;&gt;
&lt;TD style=&quot;DISPLAY: block&quot; vAlign=top&gt;
&lt;TABLE cellSpacing=2 cellPadding=0 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top&gt;&lt;INPUT id=12862 type=radio value=0 name=QUESTION_1_78267826 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD class=ANSWERTEXT&gt;부분적&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style=&quot;DISPLAY: block&quot;&gt;
&lt;TD style=&quot;DISPLAY: block&quot; vAlign=top&gt;
&lt;TABLE cellSpacing=2 cellPadding=0 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top&gt;&lt;INPUT id=13082 type=radio value=0 name=QUESTION_1_78267826 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD class=ANSWERTEXT&gt;아직 모르겠음&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;DIV class=QUESTIONCONTAINER id=SURVEYQUESTION_7708 style=&quot;DISPLAY: block&quot;&gt;&lt;INPUT type=hidden value=7708 name=id&gt;&lt;INPUT type=hidden value=CHOICE-SEQ name=type&gt;&lt;INPUT type=hidden value=0 name=required&gt; 
&lt;DIV class=QUESTIONTEXT&gt;&lt;/DIV&gt;
&lt;DIV class=QUESTIONINSTRUCTION&gt;&lt;/DIV&gt;
&lt;DIV class=QUESTIONREQUIRED&gt;&lt;/DIV&gt;&lt;INPUT type=hidden name=randomization&gt;&lt;INPUT type=hidden value=9 name=columns&gt; 
&lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;
&lt;TBODY&gt;
&lt;TR class=GHR_LEGENDTEXT&gt;
&lt;TD height=20&gt;&lt;/TD&gt;
&lt;TD vAlign=top align=left colSpan=9 height=20&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width=&quot;100%&quot;&gt;
&lt;TBODY&gt;
&lt;TR class=GHR_LEGENDTEXT&gt;
&lt;TD width=&quot;10%&quot;&gt;전적으로 동의함&lt;/TD&gt;
&lt;TD width=&quot;10%&quot;&gt;&lt;/TD&gt;
&lt;TD width=&quot;10%&quot;&gt;&lt;/TD&gt;
&lt;TD width=&quot;10%&quot;&gt;&lt;/TD&gt;
&lt;TD width=&quot;10%&quot;&gt;&lt;/TD&gt;
&lt;TD width=&quot;10%&quot;&gt;&lt;/TD&gt;
&lt;TD width=&quot;10%&quot;&gt;&lt;/TD&gt;
&lt;TD width=&quot;10%&quot;&gt;&lt;/TD&gt;
&lt;TD width=&quot;10%&quot;&gt;전혀 동의하지 않음&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=GHR_LEGENDTEXT width=&quot;25%&quot;&gt;&lt;/TD&gt;
&lt;TD class=GHR_LEGENDTEXT align=middle width=&quot;8%&quot;&gt;9&lt;/TD&gt;
&lt;TD class=GHR_LEGENDTEXT align=middle width=&quot;8%&quot;&gt;8&lt;/TD&gt;
&lt;TD class=GHR_LEGENDTEXT align=middle width=&quot;8%&quot;&gt;7&lt;/TD&gt;
&lt;TD class=GHR_LEGENDTEXT align=middle width=&quot;8%&quot;&gt;6&lt;/TD&gt;
&lt;TD class=GHR_LEGENDTEXT align=middle width=&quot;8%&quot;&gt;5&lt;/TD&gt;
&lt;TD class=GHR_LEGENDTEXT align=middle width=&quot;8%&quot;&gt;4&lt;/TD&gt;
&lt;TD class=GHR_LEGENDTEXT align=middle width=&quot;8%&quot;&gt;3&lt;/TD&gt;
&lt;TD class=GHR_LEGENDTEXT align=middle width=&quot;8%&quot;&gt;2&lt;/TD&gt;
&lt;TD class=GHR_LEGENDTEXT align=middle width=&quot;8%&quot;&gt;1&lt;/TD&gt;&lt;/TR&gt;
&lt;TR class=GHR_ODDROW style=&quot;DISPLAY: block&quot; visible=&quot;true&quot;&gt;
&lt;TD vAlign=center&gt;
&lt;DIV class=GHR_QUESTIONTEXT&gt;문서가 이해하기 쉬움&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13124 type=radio value=9 name=QUESTION_1_7708_13124 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13124 type=radio value=8 name=QUESTION_1_7708_13124 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13124 type=radio value=7 name=QUESTION_1_7708_13124 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13124 type=radio value=6 name=QUESTION_1_7708_13124 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13124 type=radio value=5 name=QUESTION_1_7708_13124 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13124 type=radio value=4 name=QUESTION_1_7708_13124 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13124 type=radio value=3 name=QUESTION_1_7708_13124 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13124 type=radio value=2 name=QUESTION_1_7708_13124 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13124 type=radio value=1 name=QUESTION_1_7708_13124 visible=&quot;true&quot;&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR class=GHR_EVENROW style=&quot;DISPLAY: block&quot; visible=&quot;true&quot;&gt;
&lt;TD vAlign=center&gt;
&lt;DIV class=GHR_QUESTIONTEXT&gt;문서가 정확함&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13125 type=radio value=9 name=QUESTION_1_7708_13125 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13125 type=radio value=8 name=QUESTION_1_7708_13125 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13125 type=radio value=7 name=QUESTION_1_7708_13125 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13125 type=radio value=6 name=QUESTION_1_7708_13125 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13125 type=radio value=5 name=QUESTION_1_7708_13125 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13125 type=radio value=4 name=QUESTION_1_7708_13125 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13125 type=radio value=3 name=QUESTION_1_7708_13125 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13125 type=radio value=2 name=QUESTION_1_7708_13125 visible=&quot;true&quot;&gt;&lt;/TD&gt;
&lt;TD align=middle&gt;&lt;INPUT id=13125 type=radio value=1 name=QUESTION_1_7708_13125 visible=&quot;true&quot;&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;DIV class=QUESTIONCONTAINER id=SURVEYQUESTION_7812&gt;&lt;INPUT type=hidden value=7812 name=id&gt;&lt;INPUT type=hidden value=TEXT-BLOCK name=type&gt;&lt;INPUT type=hidden value=0 name=required&gt; 
&lt;DIV class=QUESTIONTEXT&gt;추가 설명:&lt;/DIV&gt;
&lt;DIV class=QUESTIONINSTRUCTION&gt;&lt;/DIV&gt;
&lt;DIV class=QUESTIONREQUIRED&gt;&lt;/DIV&gt;&lt;TEXTAREA class=ANSWERBOX onpaste=enforceMaxLength(this,500,event) onkeydown=enforceMaxLength(this,500,event) name=TEXTBLOCK_7812 rows=6 cols=80&gt;&lt;/TEXTAREA&gt;&lt;/DIV&gt;
&lt;DIV class=QUESTIONCONTAINER id=SURVEYQUESTION_7813&gt;&lt;INPUT type=hidden value=7813 name=id&gt;&lt;INPUT type=hidden value=LABEL name=type&gt;&lt;INPUT type=hidden value=0 name=required&gt; 
&lt;DIV class=QUESTIONTEXT&gt;개인 정보 보호를 위해 의견에 연락처 정보를 포함하지 마십시오.&lt;/DIV&gt;
&lt;DIV class=QUESTIONINSTRUCTION&gt;&lt;/DIV&gt;
&lt;DIV class=QUESTIONREQUIRED&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=NAVIGATION&gt;
&lt;TABLE class=NAVBUTTONCONTAINER&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=PADDINGCELL&gt;&lt;/TD&gt;
&lt;TD class=NAVBUTTONCELL&gt;&lt;INPUT class=NAVBUTTON onclick=kbSurvey.next();this.blur(); type=button value=전송&gt;&lt;/TD&gt;
&lt;TD class=ENDPADDINGCELL&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV id=DIV_CLOSE style=&quot;DISPLAY: none&quot; xmlns:sw=&quot;urn:schemas-microsoft-com/PSS/PSS_Survey01&quot;&gt;
&lt;DIV class=SURVEYTHANKYOUCONTAINER&gt;
&lt;DIV class=SURVEYINTROTEXT&gt;감사합니다! 보내 주신 의견은 지원 콘텐츠를 향상시키는 데 사용됩니다. 도움이 추가로 필요한 경우 &lt;A href=&quot;http://support.microsoft.com/&quot; target=&quot;_blank&quot;&gt;&lt;FONT color=#0000ff&gt;고객지원 홈 페이지&lt;/FONT&gt;&lt;/A&gt;를 방문하십시오.&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=NAVIGATION&gt;
&lt;TABLE class=NAVBUTTONCONTAINER nowrap=&quot;yes&quot;&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=PADDINGCELL&gt;&lt;/TD&gt;
&lt;TD class=NAVBUTTONCELL&gt;&lt;/TD&gt;
&lt;TD class=ENDPADDINGCELL&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;SCRIPT type=text/javascript&gt;
			var kbSurvey = new MS.Support.Fms.Survey(&quot;fmsSurvey&quot;);
			kbSurvey.isKBEmbedded = true;
			kbSurvey.addSubmitField('REGIONID', 'ko');
			kbSurvey.addSubmitField('SITE', 'gn');
			kbSurvey.addSubmitField('SURVEYSCID', 'sw;ko;1361');
			kbSurvey.addSubmitField('SURVEYID', '1361');
			kbSurvey.addSubmitField('SURVEYNAME', '');
			kbSurvey.addSubmitField('BROWSERLANGCODE', 'ko');
			kbSurvey.addSubmitField('SURVEYLANGCODE', 'ko');
			kbSurvey.addSubmitField('FMSURL', '%252fdefault.aspx%252fkb%252f175030%252fko');
			kbSurvey.parameters = ['kb','ko','175030','','','','','','',''];
			kbSurvey.maxKBsInCookie = '10';
			kbSurvey.kbvisited = '';
		&lt;/SCRIPT&gt;
&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD class=primaryThinColumn&gt;
&lt;DIV id=thinColumn style=&quot;FLOAT: none&quot;&gt;
&lt;DIV class=&quot;wp getHelp&quot;&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 align=center&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=image&gt;&lt;A id=L_177481 href=&quot;http://support.microsoft.com/gethelp/default.aspx?content=kb;ko;175030&quot;&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/en-US/Help_support_55.gif&quot;&gt;&lt;/A&gt;&lt;/TD&gt;
&lt;TD class=text&gt;
&lt;H1&gt;&lt;BR&gt;도움이 필요하시면&lt;/H1&gt;&lt;A id=L_177481 href=&quot;http://support.microsoft.com/gethelp/default.aspx?content=kb;ko;175030&quot;&gt;&lt;FONT color=#0000ff&gt;전자 메일 또는 전화로 지원 엔지니어에게 문의하십시오&lt;/FONT&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;wp articleTrans&quot;&gt;
&lt;H1&gt;&lt;SPAN class=linkCon&gt;기술 자료 번역&lt;/SPAN&gt;&lt;SPAN class=linkConTop&gt;&lt;/SPAN&gt;&lt;/H1&gt;&lt;/FORM&gt;
&lt;FORM name=frmArticleTrans onsubmit=&quot;return SwitchLanguage(29803);&quot; action=/&gt;
&lt;DIV&gt;
&lt;TABLE cellSpacing=0 cellPadding=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;SELECT name=scid&gt;&lt;OPTION value=kb;de;175030 selected&gt;독일어&lt;/OPTION&gt;&lt;OPTION value=kb;es;175030&gt;스페인어&lt;/OPTION&gt;&lt;OPTION value=kb;it;175030&gt;이탈리아어&lt;/OPTION&gt;&lt;OPTION value=kb;ja;175030&gt;일본어&lt;/OPTION&gt;&lt;OPTION value=kb;zh-cn;175030&gt;중국어&lt;/OPTION&gt;&lt;OPTION value=kb;fr;175030&gt;프랑스어&lt;/OPTION&gt;&lt;/SELECT&gt;&lt;/TD&gt;
&lt;TD class=spacer&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&lt;INPUT onmouseover=&quot;this.src='/library/images/support/KO/go_right_02-over.gif';&quot; style=&quot;WIDTH: 24px; HEIGHT: 24px&quot; onmouseout=&quot;this.src='/library/images/support/ko/go_right_02.gif';&quot; type=image alt=&quot;기술 자료 번역&quot; src=&quot;http://support.microsoft.com/library/images/support/ko/go_right_02.gif&quot;&gt;&lt;A id=KBLangListRedirect href=&quot;&quot;&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;&lt;/FORM&gt;
&lt;FORM name=dataInfo&gt;&lt;/DIV&gt;
&lt;DIV class=wp id=SupportTools&gt;
&lt;TABLE class=LCT cellSpacing=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=textColumn&gt;
&lt;H1&gt;&lt;SPAN class=linkCon&gt;페이지 도구&lt;/SPAN&gt;&lt;SPAN class=linkConTop&gt;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;UL&gt;
&lt;LI id=PrintPage_tr&gt;&lt;SPAN&gt;&lt;A id=PrintPage title=&quot;이 페이지 인쇄&quot; onclick=&quot;return MS_HandleClick(this,'SupportTools', true);&quot; href=&quot;http://support.microsoft.com/gp/noscript&quot;&gt;&lt;FONT color=#0000ff&gt;이 페이지 인쇄&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt; 
&lt;LI id=EmailPage_tr&gt;&lt;SPAN&gt;&lt;A id=EmailPage title=&quot;전자 메일로 이 페이지 보내기&quot; onclick=&quot;return MS_HandleClick(this,'SupportTools', true);&quot; href=&quot;mailto:?body=http%3a%2f%2fsupport.microsoft.com%2fdefault.aspx%2fkb%2f175030%2fko&quot;&gt;&lt;FONT color=#0000ff&gt;전자 메일로 이 페이지 보내기&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV id=bottomRow&gt;
&lt;DIV class=&quot;wp getHelp&quot;&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 align=center&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=image&gt;&lt;A id=L_177481 href=&quot;http://support.microsoft.com/gethelp/default.aspx?content=kb;ko;175030&quot;&gt;&lt;FONT color=#0000ff&gt;&lt;IMG alt=&quot;&quot; src=&quot;http://support.microsoft.com/library/images/support/en-US/Help_support_55.gif&quot;&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;/TD&gt;
&lt;TD class=text&gt;
&lt;H1&gt;&lt;BR&gt;도움이 필요하시면&lt;/H1&gt;&lt;A id=L_177481 href=&quot;http://support.microsoft.com/gethelp/default.aspx?content=kb;ko;175030&quot;&gt;&lt;FONT color=#0000ff&gt;전자 메일 또는 전화로 지원 엔지니어에게 문의하십시오&lt;/FONT&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=gsfx_brnd_CornerContainer id=gsfx_brnd_BottomCorners&gt;
&lt;DIV class=&quot;gsfx_brnd_TBBorders gsfx_brnd_TransBG&quot; id=gsfx_brnd_BottomBorder&gt;&lt;FONT color=#0000ff&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=gsfx_brnd_Corner id=gsfx_brnd_LLowerCorner&gt;&lt;FONT color=#0000ff&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV id=gsfx_brnd_WidthFix&gt;&lt;FONT color=#0000ff&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV id=gsfx_brnd_FooterContainer&gt;
&lt;DIV class=gsfx_brnd_NetworkLeft id=gsfx_brnd_SiteFooter&gt;고객지원 &lt;/DIV&gt;
&lt;TABLE class=gsfx_brnd_NetworkRight id=gsfx_brnd_NetworkFooter&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD id=gsfx_brnd_FooterLinkContainer&gt;&lt;!--Table is wrapped in a div tag to facilitate proper alignment and stacking--&gt;
&lt;DIV class=gsfx_brnd_FooterLinks id=gsfx_brnd_SiteFooterLinks&gt;&lt;!--Table is used here in order to properly order the links for LTR and RTL while maintaining the correct tab order--&gt;
&lt;TABLE class=gsfx_brnd_NetworkRight summary=&quot;Site Footer Links&quot;&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=&quot;gsfx_brnd_NetworkLinkContainer gsfx_brnd_NetworkLink&quot;&gt;&lt;A id=L_157358 href=&quot;http://support.microsoft.com/gp/csa&quot;&gt;&lt;SPAN&gt;서비스 계약서&lt;/SPAN&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;&lt;!--Table is wrapped in a div tag to facilitate proper alignment and stacking--&gt;
&lt;DIV class=gsfx_brnd_FooterLinks id=gsfx_brnd_NetworkFooterLinks&gt;&lt;!--Table is used here in order to properly order the links for LTR and RTL while maintaining the correct tab order--&gt;
&lt;TABLE class=gsfx_brnd_NetworkRight summary=&quot;Network Footer Links&quot;&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=&quot;gsfx_brnd_NetworkLinkContainer gsfx_brnd_NetworkLink&quot;&gt;&lt;A id=L_156625 href=&quot;http://support.microsoft.com/contactus/?ws=support&quot;&gt;&lt;SPAN&gt;문의처&lt;/SPAN&gt;&lt;/A&gt;&lt;/TD&gt;
&lt;TD class=&quot;gsfx_brnd_NetworkLinkContainer gsfx_brnd_FooterSeperator&quot;&gt;|&lt;/TD&gt;
&lt;TD class=&quot;gsfx_brnd_NetworkLinkContainer gsfx_brnd_NetworkLink&quot;&gt;&lt;A id=L_156626 href=&quot;http://www.microsoft.com/korea/about/legal/default.mspx&quot;&gt;&lt;SPAN&gt;사용 약관&lt;/SPAN&gt;&lt;/A&gt;&lt;/TD&gt;
&lt;TD class=&quot;gsfx_brnd_NetworkLinkContainer gsfx_brnd_FooterSeperator&quot;&gt;|&lt;/TD&gt;
&lt;TD class=&quot;gsfx_brnd_NetworkLinkContainer gsfx_brnd_NetworkLink&quot;&gt;&lt;A id=L_156627 href=&quot;http://www.microsoft.com/library/toolbar/3.0/trademarks/ko-kr.mspx&quot;&gt;&lt;SPAN&gt;상표&lt;/SPAN&gt;&lt;/A&gt;&lt;/TD&gt;
&lt;TD class=&quot;gsfx_brnd_NetworkLinkContainer gsfx_brnd_FooterSeperator&quot;&gt;|&lt;/TD&gt;
&lt;TD class=&quot;gsfx_brnd_NetworkLinkContainer gsfx_brnd_NetworkLink&quot;&gt;&lt;A id=L_156628 href=&quot;http://privacy.microsoft.com/ko-kr/default.aspx&quot;&gt;&lt;SPAN&gt;개인 정보 정책&lt;/SPAN&gt;&lt;/A&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD id=gsfx_brnd_copyright_container&gt;
&lt;DIV id=gsfx_brnd_MSLogoContainer&gt;
&lt;DIV id=gsfx_brnd_legacy_MSLogo&gt;&lt;/DIV&gt;&lt;IMG id=gsfx_brnd_MSLogo alt=Microsoft src=&quot;http://support.microsoft.com/library/images/support/cn/gsfx_brnd_ms_logo_sml_wht.png&quot;&gt; &lt;IMG id=gsfx_brnd_MSLogoPrint alt=Microsoft src=&quot;http://support.microsoft.com/library/images/support/cn/gsfx_brnd_ms_logo_sml_blk.png&quot;&gt; &lt;/DIV&gt;&lt;SPAN id=gsfx_brnd_copyright&gt;©2009 Microsoft&lt;/SPAN&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;STYLE type=text/css&gt;   
    #gsfx_brnd_CenterContent, #gsfx_brnd_PageWrapper
    {
        background: url('/library/images/support/cn/gsfx_brnd_gn_bottom_bgrd.png') repeat-x bottom;
    }    
&lt;/STYLE&gt;

&lt;SCRIPT src=&quot;/common/script/gsfx/branding.js?19&quot; type=text/javascript&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT src=&quot;/common/script/gsfx/wtInit.js?19&quot; type=text/javascript&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT src=&quot;/common/script/gsfx/wtCore.js?19&quot; type=text/javascript&gt;&lt;/SCRIPT&gt;
&lt;NOSCRIPT&gt;&lt;img alt=&quot;&quot; id=&quot;DCSIMG&quot; width=&quot;1&quot; height=&quot;1&quot; src=&quot;http://m.webtrends.com/dcsxia05c00000s926v0z4tru_3w4l/njs.gif?dcsuri=/nojavascript&amp;WT.js=No&quot; /&gt;&lt;/NOSCRIPT&gt;&lt;IMG id=webmetriximg alt=&quot;&quot; src=&quot;http://c.microsoft.com/trans_pixel.asp?TYPE=SSPV&amp;SOURCE=SUPPORT&amp;GUID=1F4FC18C-F71E-47fb-8FC9-612F8EE59C61&amp;URI=%2fgn%2fko%2fkb_ko_175030&amp;R=http%3a%2f%2fheathaze.tistory.com%2f52%3fsrchid%3dBR1http%253A%252F%252Fheathaze.tistory.com%252F52&amp;msid=ca3dcf58222c444ea70336efd11a6191&quot;&gt;&lt;NOSCRIPT&gt;&lt;img id=&quot;StatsDotNetImgNoScript&quot; alt=&quot;&quot; src=&quot;http://support.microsoft.com/LTS/default.aspx?SSID=1&#38;SiteLCID=1042&#38;SsVersion=GSS4.8&#38;SiteCulture=ko&#38;ContentCulture=ko&#38;In404Url=&#38;EventCollectionID=1&#38;URL=%2fdefault.aspx&#38;ContentType=kb&#38;ContentLCID=1042&#38;ContentID=175030&#38;Platform=windows%20nt%205.1&#38;BrandID=1&#38;ContentProperties=6%3d9%7c7%3d2.2%7c&quot; /&gt;&lt;/NOSCRIPT&gt;&lt;IMG id=StatsDotNetImg alt=&quot;&quot; src=&quot;http://support.microsoft.com/LTS/default.aspx?SSID=1&amp;SiteLCID=1042&amp;EventCollectionID=1&amp;URL=%2fdefault.aspx&amp;ContentType=kb&amp;ContentLCID=1042&amp;ContentID=175030&amp;rctype=&amp;rclcid=&amp;rcid=&amp;rcculture=&amp;rexcid=&amp;rexlid=&amp;BrowserWidth=932&amp;BrowserHeight=578&amp;BrandID=1&amp;RefURL=http%3a%2f%2fheathaze.tistory.com%2f52%3fsrchid%3dBR1http%253A%252F%252Fheathaze.tistory.com%252F52&amp;OptionCollectionId=0&amp;EventSeqNo=1&amp;SSversion=GSS4.8&amp;SiteCulture=ko&amp;Platform=windows%20nt%205.1&amp;ContentCulture=ko&amp;In404Url=&amp;ContentProperties=6%3d9%7c7%3d2.2%7c&amp;FlexID=&amp;FlexValue1=&amp;FlexValue2=&amp;FlexValue3=&amp;FlexValue4=&amp;FlexValue5=&quot; name=StatsDotNetImg&gt;
&lt;SCRIPT type=text/javascript&gt;StatsDotNet.disabled=false;StatsDotNet.host='http\x3a\x2f\x2fsupport.microsoft.com\x2fLTS\x2fdefault.aspx';StatsDotNet.ssId='1';StatsDotNet.siteLcId='1042';StatsDotNet.SiteCulture='ko';StatsDotNet.SsVersion='GSS4.8';StatsDotNet.url='\x2fdefault.aspx';StatsDotNet.ContentCulture ='ko';StatsDotNet.contentType='kb';StatsDotNet.contentLn='1042';StatsDotNet.contentId='175030';StatsDotNet.platform='windows nt 5.1';StatsDotNet.eventCollectionId=1;StatsDotNet.siteBrandId='1';StatsDotNet.onUnloadTimeout=300;StatsDotNet.userAgentString='mozilla\x2f4.0 \x28compatible\x3b msie 6.0\x3b windows nt 5.1\x3b sv1\x3b infopath.2\x3b .net clr 2.0.50727\x3b .net clr 3.0.04506.648\x3b .net clr 3.5.21022\x3b .net clr 1.1.4322\x29';StatsDotNet.ContentProperties='6\x3d9\x7c7\x3d2.2\x7c';&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript&gt;function isDomainTracking(){var entry = fetchcookieval('fmshb');if (entry){try{return entry.split(',')[0] == '1' ? true : false;}catch (e){return false;}}return false;};window.setInterval(&quot;document.cookie = 'fmshb=' + (isDomainTracking() ? '1' : '0') + ',' + new Date().getTime() + ';path=/'&quot;, 1000);&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript&gt;var CookieDef = 'ST_GN_KO';function fmsLastExp(){     var visits = fetchcookieval(CookieDef);     var parts = visits.split('_');     if(null == visits || parts.length != 3 || isNaN(parts[0]))     {         setcookieval(CookieDef, '1_0_0');         return 0;     }     return parseInt(parts[2]);}function fmsSurveyExpired(days){     var MiliDay = 86400000;     var visits = fetchcookieval(CookieDef);     var parts = visits.split('_');     if(null == visits || parts.length != 3 || isNaN(parts[0]))     {         setcookieval(CookieDef, '1_0_0');         return true;     }     var origDate = parseInt(parts[1]);     var curDate = new Date();     return (curDate.getTime()/MiliDay - days) &gt;= origDate;}function activateSiteSurvey(){     if(window.top == window &amp;&amp; !isDomainTracking() &amp;&amp; enableSiteSurvey &amp;&amp; fmsSurveyExpired(fmsLastExp()))     {         document.write('&lt;script language=&quot;javascript&quot; src=&quot;/library/svy/broker.js&quot;&gt;&lt;/scr'+'ipt&gt;');     }}&lt;/SCRIPT&gt;

&lt;SCRIPT language=javascript&gt;if(surveyTrigger.triggerInit(1)){setTimeout(&quot;if(surveyTrigger.triggerInit(2)){surveyTrigger.fireTrigger('/common/survey.aspx?scid=sw;ko;1365&amp;XSL=','gn','gn','gn','ko','http\x253a\x252f\x252fsupport.microsoft.com\x252fdefault.aspx\x252fkb\x252f175030\x252fko','kb','ko','175030','','','','','','','');}&quot;, Delay);}else{activateSiteSurvey();}&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript&gt;function thisLoad(){KBFeedBackShowSurvey();MS_WebMetrix('http\x3a\x2f\x2fc.microsoft.com\x2ftrans_pixel.asp\x3fTYPE\x3dSSPV\x26SOURCE\x3dSUPPORT\x26GUID\x3d1F4FC18C-F71E-47fb-8FC9-612F8EE59C61\x26URI\x3d\x252fgn\x252fko\x252fkb_ko_175030\x26R\x3dhttp\x253a\x252f\x252fheathaze.tistory.com\x252f52\x253fsrchid\x253dBR1http\x25253A\x25252F\x25252Fheathaze.tistory.com\x25252F52');StatsDotNet.LogPageOnLoad();}function thisUnload(){}&lt;/SCRIPT&gt;

&lt;SCRIPT language=javascript src=&quot;/common/script/fx/gsfxsurvey.js&quot; type=text/javascript&gt;&lt;/SCRIPT&gt;
 
	    </content>
	    	</entry>
    	<entry>
	    <title>Busy Developers' Guide to HSSF</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/kihwanny/144"/>
		<id>tag:blog.daum.net,2009:kihwanny.144</id>
	    <author>
		    <name>기화니</name>
	    </author>
	    <updated>2009-02-12T11:45:49Z</updated>
	    <published>2009-02-12T11:45:49Z</published>
	    <content type="html">
	    	&lt;DIV class=date&gt;2008-05-13 20:04&lt;/DIV&gt;
&lt;TABLE style=&quot;TABLE-LAYOUT: fixed&quot;&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;DIV class=cnt&gt;&lt;BR&gt;&lt;FONT color=#013add&gt;1.2.22. Shift rows up or down on a sheet&lt;/FONT&gt;&lt;BR&gt;HSSFWorkbook wb = new HSSFWorkbook();&lt;BR&gt;HSSFSheet sheet = wb.createSheet(&quot;row sheet&quot;);&lt;BR&gt;// Create various cells and rows for spreadsheet.&lt;BR&gt;// Shift rows 6 - 11 on the spreadsheet to the top (rows 0 - 5)&lt;BR&gt;sheet.shiftRows(5, 10, -5);&lt;BR&gt;FileOutputStream fileOut = new FileOutputStream(&quot;workbook.xls&quot;);&lt;BR&gt;wb.write(fileOut);&lt;BR&gt;fileOut.close();&lt;BR&gt;1.2.23. Set a sheet as selected&lt;BR&gt;HSSFWorkbook wb = new HSSFWorkbook();&lt;BR&gt;HSSFSheet sheet = wb.createSheet(&quot;row sheet&quot;);&lt;BR&gt;sheet.setSelected(true);&lt;BR&gt;// Create various cells and rows for spreadsheet.&lt;BR&gt;FileOutputStream fileOut = new FileOutputStream(&quot;workbook.xls&quot;);&lt;BR&gt;wb.write(fileOut);&lt;BR&gt;fileOut.close();&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=cnt&gt;&lt;FONT color=#013add&gt;1.2.24. Set the zoom magnification&lt;BR&gt;&lt;/FONT&gt;The zoom is expressed as a fraction. For example to express a zoom of 75% use 3 for the&lt;BR&gt;numerator and 4 for the denominator.&lt;BR&gt;HSSFWorkbook wb = new HSSFWorkbook();&lt;BR&gt;HSSFSheet sheet1 = wb.createSheet(&quot;new sheet&quot;);&lt;BR&gt;sheet1.setZoom(3,4); // 75 percent magnification&lt;BR&gt;FileOutputStream fileOut = new FileOutputStream(&quot;workbook.xls&quot;);&lt;BR&gt;wb.write(fileOut);&lt;BR&gt;fileOut.close();&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=cnt&gt;&lt;FONT color=#013add&gt;1.2.25. Splits and freeze panes&lt;BR&gt;&lt;/FONT&gt;There are two types of panes you can create; freeze panes and split panes.&lt;BR&gt;A freeze pane is split by columns and rows. You create a freeze pane using the following&lt;BR&gt;mechanism:&lt;BR&gt;sheet1.createFreezePane( 3, 2, 3, 2 );&lt;BR&gt;The first two parameters are the columns and rows you wish to split by. The second two&lt;BR&gt;parameters indicate the cells that are visible in the bottom right quadrant.&lt;BR&gt;Split pains appear differently. The split area is divided into four separate work area's. The&lt;BR&gt;split occurs at the pixel level and the user is able to adjust the split by dragging it to a new&lt;BR&gt;position.&lt;BR&gt;Split panes are created with the following call:&lt;BR&gt;sheet2.createSplitPane( 2000, 2000, 0, 0, HSSFSheet.PANE_LOWER_LEFT );&lt;BR&gt;The first parameter is the x position of the split. This is in 1/20th of a point. A point in this&lt;BR&gt;case seems to equate to a pixel. The second parameter is the y position of the split. Again in&lt;BR&gt;1/20th of a point.&lt;BR&gt;The last parameter indicates which pane currently has the focus. This will be one of&lt;BR&gt;HSSFSheet.PANE_LOWER_LEFT, PANE_LOWER_RIGHT, PANE_UPPER_RIGHT or&lt;BR&gt;PANE_UPPER_LEFT.&lt;BR&gt;HSSFWorkbook wb = new HSSFWorkbook();&lt;BR&gt;HSSFSheet sheet1 = wb.createSheet(&quot;new sheet&quot;);&lt;BR&gt;HSSFSheet sheet2 = wb.createSheet(&quot;second sheet&quot;);&lt;BR&gt;HSSFSheet sheet3 = wb.createSheet(&quot;third sheet&quot;);&lt;BR&gt;HSSFSheet sheet4 = wb.createSheet(&quot;fourth sheet&quot;);&lt;BR&gt;// Freeze just one row&lt;BR&gt;sheet1.createFreezePane( 0, 1, 0, 1 );&lt;BR&gt;// Freeze just one column&lt;BR&gt;sheet2.createFreezePane( 1, 0, 1, 0 );&lt;BR&gt;// Freeze the columns and rows (forget about scrolling position of the lower right quadrant).&lt;BR&gt;sheet3.createFreezePane( 2, 2 );&lt;BR&gt;// Create a split with the lower left side being the active quadrant&lt;BR&gt;sheet4.createSplitPane( 2000, 2000, 0, 0, HSSFSheet.PANE_LOWER_LEFT );&lt;BR&gt;FileOutputStream fileOut = new FileOutputStream(&quot;workbook.xls&quot;);&lt;BR&gt;wb.write(fileOut);&lt;BR&gt;fileOut.close();&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=cnt&gt;&lt;FONT color=#013add&gt;1.2.26. Repeating rows and columns&lt;BR&gt;&lt;/FONT&gt;It's possible to set up repeating rows and columns in your printouts by using the&lt;BR&gt;setRepeatingRowsAndColumns() function in the HSSFWorkbook class.&lt;BR&gt;This function Contains 5 parameters. The first parameter is the index to the sheet (0 = first&lt;BR&gt;sheet). The second and third parameters specify the range for the columns to repreat. To stop&lt;BR&gt;the columns from repeating pass in -1 as the start and end column. The fourth and fifth&lt;BR&gt;parameters specify the range for the rows to repeat. To stop the columns from repeating pass&lt;BR&gt;in -1 as the start and end rows.&lt;BR&gt;HSSFWorkbook wb = new HSSFWorkbook();&lt;BR&gt;HSSFSheet sheet1 = wb.createSheet(&quot;new sheet&quot;);&lt;BR&gt;HSSFSheet sheet2 = wb.createSheet(&quot;second sheet&quot;);&lt;BR&gt;// Set the columns to repeat from column 0 to 2 on the first sheet&lt;BR&gt;wb.setRepeatingRowsAndColumns(0,0,2,-1,-1);&lt;BR&gt;// Set the the repeating rows and columns on the second sheet.&lt;BR&gt;wb.setRepeatingRowsAndColumns(1,4,5,1,2);&lt;BR&gt;FileOutputStream fileOut = new FileOutputStream(&quot;workbook.xls&quot;);&lt;BR&gt;wb.write(fileOut);&lt;BR&gt;fileOut.close();&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=cnt&gt;&lt;FONT color=#013add&gt;1.2.27. Headers and Footers&lt;BR&gt;&lt;/FONT&gt;Example is for headers but applies directly to footers.&lt;BR&gt;HSSFWorkbook wb = new HSSFWorkbook();&lt;BR&gt;HSSFSheet sheet = wb.createSheet(&quot;new sheet&quot;);&lt;BR&gt;HSSFHeader header = sheet.getHeader();&lt;BR&gt;header.setCenter(&quot;Center Header&quot;);&lt;BR&gt;header.setLeft(&quot;Left Header&quot;);&lt;BR&gt;header.setRight(HSSFHeader.font(&quot;Stencil-Normal&quot;, &quot;Italic&quot;) +&lt;BR&gt;HSSFHeader.fontSize((short) 16) + &quot;Right w/ Stencil-Normal Italic font FileOutputStream fileOut = new FileOutputStream(&quot;workbook.xls&quot;);&lt;BR&gt;wb.write(fileOut);&lt;BR&gt;fileOut.close();&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=cnt&gt;&lt;FONT color=#013add&gt;1.2.28. Drawing Shapes&lt;BR&gt;&lt;/FONT&gt;POI supports drawing shapes using the Microsoft Office drawing tools. Shapes on a sheet are&lt;BR&gt;organized in a hiearchy of groups and and shapes. The top-most shape is the patriarch. This is&lt;BR&gt;not visisble on the sheet at all. To start drawing you need to call createPatriarch on&lt;BR&gt;the HSSFSheet class. This has the effect erasing any other shape information stored in that&lt;BR&gt;sheet. By default POI will leave shape records alone in the sheet unless you make a call to&lt;BR&gt;this method.&lt;BR&gt;To create a shape you have to go through the following steps:&lt;BR&gt;1. Create the patriarch.&lt;BR&gt;2. Create an anchor to position the shape on the sheet.&lt;BR&gt;3. Ask the patriarch to create the shape.&lt;BR&gt;4. Set the shape type (line, oval, rectangle etc...)&lt;BR&gt;5. Set any other style details converning the shape. (eg: line thickness, etc...)&lt;BR&gt;HSSFPatriarch patriarch = sheet.createDrawingPatriarch();&lt;BR&gt;a = new HSSFClientAnchor( 0, 0, 1023, 255, (short) 1, 0, (short) 1, 0 );&lt;BR&gt;HSSFSimpleShape shape1 = patriarch.createSimpleShape(a1);&lt;BR&gt;shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);&lt;BR&gt;Text boxes are created using a different call:&lt;BR&gt;HSSFTextbox textbox1 = patriarch.createTextbox(&lt;BR&gt;new HSSFClientAnchor(0,0,0,0,(short)1,1,(short)2,2));&lt;BR&gt;textbox1.setString(new HSSFRichTextString(&quot;This is a test&quot;) );&lt;BR&gt;It's possible to use different fonts to style parts of the text in the textbox. Here's how:&lt;BR&gt;HSSFFont font = wb.createFont();&lt;BR&gt;font.setItalic(true);&lt;BR&gt;font.setUnderline(HSSFFont.U_DOUBLE);&lt;BR&gt;HSSFRichTextString string = new HSSFRichTextString(&quot;Woo!!!&quot;);&lt;BR&gt;string.applyFont(2,5,font);&lt;BR&gt;textbox.setString(string );&lt;BR&gt;Just as can be done manually using Excel, it is possible to group shapes together. This is&lt;BR&gt;done by calling createGroup() and then creating the shapes using those groups.&lt;BR&gt;It's also possible to create groups within groups.&lt;BR&gt;Note:&lt;BR&gt;Any group you create should contain at least two other shapes or subgroups.&lt;BR&gt;Here's how to create a shape group:&lt;BR&gt;// Create a shape group.&lt;BR&gt;HSSFShapeGroup group = patriarch.createGroup(&lt;BR&gt;new HSSFClientAnchor(0,0,900,200,(short)2,2,(short)2,2));&lt;BR&gt;// Create a couple of lines in the group.&lt;BR&gt;HSSFSimpleShape shape1 = group.createShape(new HSSFChildAnchor(3,3,500,500));&lt;BR&gt;shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);&lt;BR&gt;( (HSSFChildAnchor) shape1.getAnchor() ).setAnchor((short)3,3,500,500);&lt;BR&gt;HSSFSimpleShape shape2 = group.createShape(new HSSFChildAnchor((short)1,200,400,600));&lt;BR&gt;shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);&lt;BR&gt;If you're being observant you'll noticed that the shapes that are added to the group use a new&lt;BR&gt;type of anchor: the HSSFChildAnchor. What happens is that the created group has it's&lt;BR&gt;own coordinate space for shapes that are placed into it. POI defaults this to (0,0,1023,255)&lt;BR&gt;but you are able to change it as desired. Here's how:&lt;BR&gt;myGroup.setCoordinates(10,10,20,20); // top-left, bottom-right&lt;BR&gt;If you create a group within a group it's also going to have it's own coordinate space.&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=cnt&gt;&lt;FONT color=#013add&gt;1.2.29. Styling Shapes&lt;BR&gt;&lt;/FONT&gt;By default shapes can look a little plain. It's possible to apply different styles to the shapes&lt;BR&gt;however. The sorts of things that can currently be done are:&lt;BR&gt;?Change the fill color.&lt;BR&gt;?Make a shape with no fill color.&lt;BR&gt;?Change the thickness of the lines.&lt;BR&gt;?Change the style of the lines. Eg: dashed, dotted.&lt;BR&gt;?Change the line color.&lt;BR&gt;Here's an examples of how this is done:&lt;BR&gt;HSSFSimpleShape s = patriarch.createSimpleShape(a);&lt;BR&gt;s.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);&lt;BR&gt;s.setLineStyleColor(10,10,10);&lt;BR&gt;s.setFillColor(90,10,200);&lt;BR&gt;s.setLineWidth(HSSFShape.LINEWIDTH_ONE_PT * 3);&lt;BR&gt;s.setLineStyle(HSSFShape.LINESTYLE_DOTSYS);&lt;BR&gt;1.2.30. Shapes and Graphics2d&lt;BR&gt;While the native POI shape drawing commands are the recommended way to draw shapes in&lt;BR&gt;a shape it's sometimes desirable to use a standard API for compatibility with external&lt;BR&gt;libraries. With this in mind we created some wrappers for Graphics and Graphics2d.&lt;BR&gt;Note:&lt;BR&gt;It's important to not however before continuing that Graphics2d is a poor match to the capabilities of the Microsoft Office&lt;BR&gt;drawing commands. The older Graphics class offers a closer match but is still a square peg in a round hole.&lt;BR&gt;All Graphics commands are issued into an HSSFShapeGroup. Here's how it's done:&lt;BR&gt;a = new HSSFClientAnchor( 0, 0, 1023, 255, (short) 1, 0, (short) 1, 0 );&lt;BR&gt;group = patriarch.createGroup( a );&lt;BR&gt;group.setCoordinates( 0, 0, 80 * 4 , 12 * 23 );&lt;BR&gt;float verticalPointsPerPixel = a.getAnchorHeightInPoints(sheet) / (float)Math.abs(group.g = new EscherGraphics( group, wb, Color.black, verticalPointsPerPixel );&lt;BR&gt;g2d = new EscherGraphics2d( g );&lt;BR&gt;drawChemicalStructure( g2d );&lt;BR&gt;The first thing we do is create the group and set it's coordinates to match what we plan to&lt;BR&gt;draw. Next we calculate a reasonable fontSizeMultipler then create the EscherGraphics&lt;BR&gt;object. Since what we really want is a Graphics2d object we create an EscherGraphics2d&lt;BR&gt;object and pass in the graphics object we created. Finally we call a routine that draws into the&lt;BR&gt;EscherGraphics2d object.&lt;BR&gt;The vertical points per pixel deserves some more explanation. One of the difficulties in&lt;BR&gt;converting Graphics calls into escher drawing calls is that Excel does not have the concept of&lt;BR&gt;absolute pixel positions. It measures it's cell widths in 'characters' and the cell heights in&lt;BR&gt;points. Unfortunately it's not defined exactly what type of character it's measuring.&lt;BR&gt;Presumably this is due to the fact that the Excel will be using different fonts on different&lt;BR&gt;platforms or even within the same platform.&lt;BR&gt;Because of this constraint we've had to implement the concept of a verticalPointsPerPixel.&lt;BR&gt;This the amount the font should be scaled by when you issue commands such as&lt;BR&gt;drawString(). To calculate this value use the follow formula:&lt;BR&gt;multipler = groupHeightInPoints / heightOfGroup&lt;BR&gt;The height of the group is calculated fairly simply by calculating the difference between the&lt;BR&gt;y coordinates of the bounding box of the shape. The height of the group can be calculated by&lt;BR&gt;using a convenience called HSSFClientAnchor.getAnchorHeightInPoints().&lt;BR&gt;Many of the functions supported by the graphics classes are not complete. Here's some of the&lt;BR&gt;functions that are known to work.&lt;BR&gt;?fillRect()&lt;BR&gt;?fillOval()&lt;BR&gt;?drawString()&lt;BR&gt;?drawOval()&lt;BR&gt;?drawLine()&lt;BR&gt;?clearRect()&lt;BR&gt;Functions that are not supported will return and log a message using the POI logging&lt;BR&gt;infrastructure (disabled by default).&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=cnt&gt;&lt;FONT color=#013add&gt;1.2.31. Outlining&lt;BR&gt;&lt;/FONT&gt;Outlines are great for grouping sections of information together and can be added easily to&lt;BR&gt;columns and rows using the POI API. Here's how:&lt;BR&gt;HSSFWorkbook wb = new HSSFWorkbook();&lt;BR&gt;HSSFSheet sheet1 = wb.createSheet(&quot;new sheet&quot;);&lt;BR&gt;sheet1.groupRow( 5, 14 );&lt;BR&gt;sheet1.groupRow( 7, 14 );&lt;BR&gt;sheet1.groupRow( 16, 19 );&lt;BR&gt;sheet1.groupColumn( (short)4, (short)7 );&lt;BR&gt;sheet1.groupColumn( (short)9, (short)12 );&lt;BR&gt;sheet1.groupColumn( (short)10, (short)11 );&lt;BR&gt;FileOutputStream fileOut = new FileOutputStream(filename);&lt;BR&gt;wb.write(fileOut);&lt;BR&gt;fileOut.close();&lt;BR&gt;To collapse (or expand) an outline use the following calls:&lt;BR&gt;sheet1.setRowGroupCollapsed( 7, true );&lt;BR&gt;sheet1.setColumnGroupCollapsed( (short)4, true );&lt;BR&gt;The row/column you choose should contain an already created group. It can be anywhere&lt;BR&gt;within the group.&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=cnt&gt;&lt;FONT color=#013add&gt;2. Images&lt;BR&gt;&lt;/FONT&gt;Images are part of the drawing support. To add an image just call createPicture() on&lt;BR&gt;the drawing patriarch. At the time of writing the following types are supported:&lt;BR&gt;?PNG&lt;BR&gt;?JPG&lt;BR&gt;?DIB&lt;BR&gt;It should be noted that any existing drawings may be erased once you add a image to a sheet.&lt;BR&gt;// Create the drawing patriarch. This is the top level container for&lt;BR&gt;// all shapes. This will clear out any existing shapes for that sheet.&lt;BR&gt;HSSFPatriarch patriarch = sheet5.createDrawingPatriarch();&lt;BR&gt;HSSFClientAnchor anchor;&lt;BR&gt;anchor = new HSSFClientAnchor(0,0,0,255,(short)2,2,(short)4,7);&lt;BR&gt;anchor.setAnchorType( 2 );&lt;BR&gt;patriarch.createPicture(anchor, loadPicture( &quot;src/resources/logos/logoKarmokar4.png&quot;, Creating an image and setting its anchor to the actual width and height:&lt;BR&gt;HSSFPatriarch patriarch = sheet5.createDrawingPatriarch();&lt;BR&gt;HSSFPicture picture = patriarch.createPicture(new HSSFClientAnchor(), loadPicture( &quot;picture.resize();&lt;BR&gt;or&lt;BR&gt;HSSFPatriarch patriarch = sheet5.createDrawingPatriarch();&lt;BR&gt;HSSFPicture picture = patriarch.createPicture(new HSSFClientAnchor(), loadPicture( &quot;HSSFClientAnchor preferredSize = picture.getPreferredSize();&lt;BR&gt;picture.setAnchor(preferredSize);&lt;BR&gt;Note:&lt;BR&gt;HSSFPicture.resize() works only for JPEG and PNG. Other formats are not yet supported.&lt;BR&gt;Reading images from a workbook:&lt;BR&gt;HSSFWorkbook wb;&lt;BR&gt;List lst = wb.getAllPictures();&lt;BR&gt;for (Iterator it = lst.iterator(); it.hasNext(); ) {&lt;BR&gt;HSSFPictureData pict = (HSSFPictureData)it.next();&lt;BR&gt;String ext = pict.suggestFileExtension();&lt;BR&gt;byte[] data = pict.getData();&lt;BR&gt;if (ext.equals(&quot;jpeg&quot;)){&lt;BR&gt;FileOutputStream out = new FileOutputStream(&quot;pict.jpg&quot;);&lt;BR&gt;out.write(data);&lt;BR&gt;out.close();&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=cnt&gt;&lt;FONT color=#013add&gt;3. Named Ranges and Named Cells&lt;BR&gt;&lt;/FONT&gt;Named Range is a way to refer to a group of cells by a name. Named Cell is a degenerate&lt;BR&gt;case of Named Range in that the 'group of cells' contains exactly one cell. You can create as&lt;BR&gt;well as refer to cells in a workbook by their named range. When working with Named&lt;BR&gt;Ranges, the classes: org.apache.poi.hssf.util.CellReference and &amp;&lt;BR&gt;org.apache.poi.hssf.util.AreaReference are used.&lt;BR&gt;Creating Named Range / Named Cell&lt;BR&gt;// setup code&lt;BR&gt;String sname = &quot;TestSheet&quot;, cname = &quot;TestName&quot;, cvalue = &quot;TestVal&quot;;&lt;BR&gt;HSSFWorkbook wb = new HSSFWorkbook();&lt;BR&gt;HSSFSheet sheet = wb.createSheet(sname);&lt;BR&gt;sheet.createRow(0).createCell((short) 0).setCellValue(cvalue);&lt;BR&gt;// 1. create named range for a single cell using areareference&lt;BR&gt;HSSFName namedCell = wb.createName();&lt;BR&gt;namedCell.setNameName(cname);&lt;BR&gt;String reference = sname+&quot;!A1:A1&quot;; // area reference&lt;BR&gt;namedCell.setReference(reference);&lt;BR&gt;// 2. create named range for a single cell using cellreference&lt;BR&gt;HSSFName namedCell = wb.createName();&lt;BR&gt;namedCell.setNameName(cname);&lt;BR&gt;String reference = sname+&quot;!A1&quot;; // cell reference&lt;BR&gt;namedCell.setReference(reference);&lt;BR&gt;// 3. create named range for an area using AreaReference&lt;BR&gt;HSSFName namedCell = wb.createName();&lt;BR&gt;namedCell.setNameName(cname);&lt;BR&gt;String reference = sname+&quot;!A1:C5&quot;; // area reference&lt;BR&gt;namedCell.setReference(reference);&lt;BR&gt;Reading from Named Range / Named Cell&lt;BR&gt;// setup code&lt;BR&gt;String cname = &quot;TestName&quot;;&lt;BR&gt;HSSFWorkbook wb = getMyWorkbook(); // retrieve workbook&lt;BR&gt;// retrieve the named range&lt;BR&gt;int namedCellIdx = wb.getNameIndex(cellName);&lt;BR&gt;HSSFName aNamedCell = wb.getNameAt(namedCellIdx);&lt;BR&gt;// retrieve the cell at the named range and test its contents&lt;BR&gt;AreaReference aref = new AreaReference(aNamedCell.getReference());&lt;BR&gt;CellReference[] crefs = aref.getAllReferencedCells();&lt;BR&gt;for (int i=0; i&lt;crefs.length; i++) {&lt;BR&gt;HSSFSheet s = wb.getSheet(crefs[i].getSheetName());&lt;BR&gt;HSSFRow r = sheet.getRow(crefs[i].getRow());&lt;BR&gt;HSSFCell c = r.getCell(crefs[i].getCol());&lt;BR&gt;// extract the cell contents based on cell type etc.&lt;BR&gt;}&lt;BR&gt;Reading from non-contiguous Named Ranges&lt;BR&gt;// Setup code&lt;BR&gt;String cname = &quot;TestName&quot;;&lt;BR&gt;HSSFWorkbook wb = getMyWorkbook(); // retrieve workbook&lt;BR&gt;// Retrieve the named range&lt;BR&gt;// Will be something like &quot;$C$10,$D$12:$D$14&quot;;&lt;BR&gt;int namedCellIdx = wb.getNameIndex(cellName);&lt;BR&gt;HSSFName aNamedCell = wb.getNameAt(namedCellIdx);&lt;BR&gt;// Retrieve the cell at the named range and test its contents&lt;BR&gt;// Will get back one AreaReference for C10, and&lt;BR&gt;// another for D12 to D14&lt;BR&gt;AreaReference[] arefs = AreaReference.generateContiguous(aNamedCell.getReference());&lt;BR&gt;for (int i=0; i&lt;arefs.length; i++) {&lt;BR&gt;// Only get the corners of the Area&lt;BR&gt;// (use arefs[i].getAllReferencedCells() to get all cells)&lt;BR&gt;CellReference[] crefs = arefs[i].getCells();&lt;BR&gt;for (int j=0; j&lt;crefs.length; j++) {&lt;BR&gt;// Check it turns into real stuff&lt;BR&gt;HSSFSheet s = wb.getSheet(crefs[j].getSheetName());&lt;BR&gt;HSSFRow r = s.getRow(crefs[j].getRow());&lt;BR&gt;HSSFCell c = r.getCell(crefs[j].getCol());&lt;BR&gt;// Do something with this corner cell&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=cnt&gt;&lt;FONT color=#013add&gt;4. Cell Comments&lt;BR&gt;&lt;/FONT&gt;In Excel a comment is a kind of a text shape, so inserting a comment is very similar to&lt;BR&gt;placing a text box in a worksheet:&lt;BR&gt;HSSFWorkbook wb = new HSSFWorkbook();&lt;BR&gt;HSSFSheet sheet = wb.createSheet(&quot;Cell comments in POI HSSF&quot;);&lt;BR&gt;// Create the drawing patriarch. This is the top level container for all shapes including HSSFPatriarch patr = sheet.createDrawingPatriarch();&lt;BR&gt;//create a cell in row 3&lt;BR&gt;HSSFCell cell1 = sheet.createRow(3).createCell((short)1);&lt;BR&gt;cell1.setCellValue(new HSSFRichTextString(&quot;Hello, World&quot;));&lt;BR&gt;//anchor defines size and position of the comment in worksheet&lt;BR&gt;HSSFComment comment1 = patr.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short)4, // set text in the comment&lt;BR&gt;comment1.setString(new HSSFRichTextString(&quot;We can set comments in POI&quot;));&lt;BR&gt;//set comment author.&lt;BR&gt;//you can see it in the status bar when moving mouse over the commented cell&lt;BR&gt;comment1.setAuthor(&quot;Apache Software Foundation&quot;);&lt;BR&gt;// The first way to assign comment to a cell is via HSSFCell.setCellComment method&lt;BR&gt;cell1.setCellComment(comment1);&lt;BR&gt;//create another cell in row 6&lt;BR&gt;HSSFCell cell2 = sheet.createRow(6).createCell((short)1);&lt;BR&gt;cell2.setCellValue(36.6);&lt;BR&gt;HSSFComment comment2 = patr.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short)4, //modify background color of the comment&lt;BR&gt;comment2.setFillColor(204, 236, 255);&lt;BR&gt;HSSFRichTextString string = new HSSFRichTextString(&quot;Normal body temperature&quot;);&lt;BR&gt;//apply custom font to the text in the comment&lt;BR&gt;HSSFFont font = wb.createFont();&lt;BR&gt;font.setFontName(&quot;Arial&quot;);&lt;BR&gt;font.setFontHeightInPoints((short)10);&lt;BR&gt;font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);&lt;BR&gt;font.setColor(HSSFColor.RED.index);&lt;BR&gt;string.applyFont(font);&lt;BR&gt;comment2.setString(string);&lt;BR&gt;//by default comments are hidden. This one is always visible.&lt;BR&gt;comment2.setVisible(true);&lt;BR&gt;comment2.setAuthor(&quot;Bill Gates&quot;);&lt;BR&gt;/**&lt;BR&gt;* The second way to assign comment to a cell is to implicitly specify its row and column.&lt;BR&gt;* Note, it is possible to set row and column of a non-existing cell.&lt;BR&gt;* It works, the commnet is visible.&lt;BR&gt;*/&lt;BR&gt;comment2.setRow(6);&lt;BR&gt;comment2.setColumn((short)1);&lt;BR&gt;FileOutputStream out = new FileOutputStream(&quot;poi_comment.xls&quot;);&lt;BR&gt;wb.write(out);&lt;BR&gt;out.close();&lt;BR&gt;Reading cell comments&lt;BR&gt;HSSFCell cell = sheet.get(3).getColumn((short)1);&lt;BR&gt;HSSFComment comment = cell.getCellComment();&lt;BR&gt;if (comment != null) {&lt;BR&gt;HSSFRichTextString str = comment.getString();&lt;BR&gt;String author = comment.getAuthor();&lt;BR&gt;}&lt;BR&gt;// alternatively you can retrieve cell comments by (row, column)&lt;BR&gt;comment = sheet.getCellComment(3, 1);&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=cnt&gt;&lt;FONT color=#013add&gt;5. Adjust column width to fit the contents&lt;BR&gt;&lt;/FONT&gt;HSSFSheet sheet = workbook.getSheetAt(0);&lt;BR&gt;sheet.autoSizeColumn((short)0); //adjust width of the first column&lt;BR&gt;sheet.autoSizeColumn((short)1); //adjust width of the second column&lt;BR&gt;Note:&lt;BR&gt;To calculate column width HSSFSheet.autoSizeColumn uses Java2D classes that throw exception if graphical environment is&lt;BR&gt;not available. In case if graphical environment is not available, you must tell Java that you are running in headless mode and&lt;BR&gt;set the following system property: java.awt.headless=true (either via -Djava.awt.headless=true startup&lt;BR&gt;parameter or via System.setProperty(&quot;java.awt.headless&quot;, &quot;true&quot;)).&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=cnt&gt;&lt;FONT color=#013add&gt;6. How to read hyperlinks&lt;BR&gt;&lt;/FONT&gt;HSSFSheet sheet = workbook.getSheetAt(0);&lt;BR&gt;HSSFCell cell = sheet.getRow(0).getCell((short)0);&lt;BR&gt;HSSFHyperlink link = cell.getHyperlink();&lt;BR&gt;if(link != null){&lt;BR&gt;System.out.println(link.getAddress());&lt;BR&gt;}&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=cnt&gt;&lt;FONT color=#013add&gt;7. How to create hyperlinks&lt;BR&gt;&lt;/FONT&gt;HSSFWorkbook wb = new HSSFWorkbook();&lt;BR&gt;//cell style for hyperlinks&lt;BR&gt;//by default hypelrinks are blue and underlined&lt;BR&gt;HSSFCellStyle hlink_style = wb.createCellStyle();&lt;BR&gt;HSSFFont hlink_font = wb.createFont();&lt;BR&gt;hlink_font.setUnderline(HSSFFont.U_SINGLE);&lt;BR&gt;hlink_font.setColor(HSSFColor.BLUE.index);&lt;BR&gt;hlink_style.setFont(hlink_font);&lt;BR&gt;HSSFCell cell;&lt;BR&gt;HSSFSheet sheet = wb.createSheet(&quot;Hyperlinks&quot;);&lt;BR&gt;//URL&lt;BR&gt;cell = sheet.createRow(0).createCell((short)0);&lt;BR&gt;cell.setCellValue(&quot;URL Link&quot;);&lt;BR&gt;HSSFHyperlink link = new HSSFHyperlink(HSSFHyperlink.LINK_URL);&lt;BR&gt;link.setAddress(&quot;&lt;A href=&quot;http://poi.apache.org/&quot; target=&quot;_blank&quot;&gt;&lt;FONT color=#800080&gt;http://poi.apache.org/&lt;/FONT&gt;&lt;/A&gt;&quot;);&lt;BR&gt;cell.setHyperlink(link);&lt;BR&gt;cell.setCellStyle(hlink_style);&lt;BR&gt;//link to a file in the current directory&lt;BR&gt;cell = sheet.createRow(1).createCell((short)0);&lt;BR&gt;cell.setCellValue(&quot;File Link&quot;);&lt;BR&gt;link = new HSSFHyperlink(HSSFHyperlink.LINK_FILE);&lt;BR&gt;link.setAddress(&quot;link1.xls&quot;);&lt;BR&gt;cell.setHyperlink(link);&lt;BR&gt;cell.setCellStyle(hlink_style);&lt;BR&gt;//e-mail link&lt;BR&gt;cell = sheet.createRow(2).createCell((short)0);&lt;BR&gt;cell.setCellValue(&quot;Email Link&quot;);&lt;BR&gt;link = new HSSFHyperlink(HSSFHyperlink.LINK_EMAIL);&lt;BR&gt;//note, if subject contains white spaces, make sure they are url-encoded&lt;BR&gt;link.setAddress(&quot;&lt;A href=&quot;mailto:poi@apache.org?subject=Hyperlinks&quot;&gt;&lt;FONT color=#0000ff&gt;mailto:poi@apache.org?subject=Hyperlinks&lt;/FONT&gt;&lt;/A&gt;&quot;);&lt;BR&gt;cell.setHyperlink(link);&lt;BR&gt;cell.setCellStyle(hlink_style);&lt;BR&gt;//link to a place in this workbook&lt;BR&gt;//create a target sheet and cell&lt;BR&gt;HSSFSheet sheet2 = wb.createSheet(&quot;Target Sheet&quot;);&lt;BR&gt;sheet2.createRow(0).createCell((short)0).setCellValue(&quot;Target Cell&quot;);&lt;BR&gt;cell = sheet.createRow(3).createCell((short)0);&lt;BR&gt;cell.setCellValue(&quot;Worksheet Link&quot;);&lt;BR&gt;link = new HSSFHyperlink(HSSFHyperlink.LINK_DOCUMENT);&lt;BR&gt;link.setAddress(&quot;'Target Sheet'!A1&quot;);&lt;BR&gt;cell.setHyperlink(link);&lt;BR&gt;cell.setCellStyle(hlink_style);&lt;BR&gt;FileOutputStream out = new FileOutputStream(&quot;hssf-links.xls&quot;);&lt;BR&gt;wb.write(out);&lt;BR&gt;out.close();&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0NMjX&amp;amp;tagName=Java&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Java&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0NMjX&amp;amp;tagName=Excel&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Excel&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0NMjX&amp;amp;tagName=POI&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;POI&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0NMjX&amp;amp;tagName=HSSF&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;HSSF&lt;/a&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>tts program</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/kihwanny/140"/>
		<id>tag:blog.daum.net,2009:kihwanny.140</id>
	    <author>
		    <name>기화니</name>
	    </author>
	    <updated>2009-02-04T17:46:11Z</updated>
	    <published>2009-02-04T17:46:11Z</published>
	    <content type="html">
	    	&lt;P&gt;영어 읽어주는 tts program&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://www.cepstral.com/downloads/&quot; target=&quot;_blank&quot;&gt;&lt;FONT color=#013add&gt;http://www.cepstral.com/downloads/&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>w3schools site</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/kihwanny/139"/>
		<id>tag:blog.daum.net,2009:kihwanny.139</id>
	    <author>
		    <name>기화니</name>
	    </author>
	    <updated>2009-02-04T16:46:19Z</updated>
	    <published>2009-02-04T16:46:19Z</published>
	    <content type="html">
	    	&lt;P&gt;아주 유용한 학습 site!!&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://www.w3schools.com/cert/cert_php.asp&quot; target=&quot;_blank&quot;&gt;&lt;FONT color=#013add&gt;http://www.w3schools.com/cert/cert_php.asp&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>w3schools site</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/kihwanny/138"/>
		<id>tag:blog.daum.net,2009:kihwanny.138</id>
	    <author>
		    <name>기화니</name>
	    </author>
	    <updated>2009-02-04T16:44:42Z</updated>
	    <published>2009-02-04T16:44:42Z</published>
	    <content type="html">
	    	&lt;P&gt;아주 유용한 학습 site!!&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://www.w3schools.com/js/default.asp&quot; target=&quot;_blank&quot;&gt;&lt;FONT color=#013add&gt;http://www.w3schools.com/js/default.asp&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>w3schools site</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/kihwanny/137"/>
		<id>tag:blog.daum.net,2009:kihwanny.137</id>
	    <author>
		    <name>기화니</name>
	    </author>
	    <updated>2009-02-04T16:42:33Z</updated>
	    <published>2009-02-04T16:42:33Z</published>
	    <content type="html">
	    	&lt;P&gt;아주 유용한 학습 site!!&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://www.w3schools.com/asp/&quot; target=&quot;_blank&quot;&gt;&lt;FONT color=#013add&gt;http://www.w3schools.com/asp/&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0NMjX&amp;amp;tagName=ASP&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;ASP&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0NMjX&amp;amp;tagName=w3school&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;w3school&lt;/a&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>IIS 메타베이스에 액세스하지 못했습니다</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/kihwanny/133"/>
		<id>tag:blog.daum.net,2009:kihwanny.133</id>
	    <author>
		    <name>기화니</name>
	    </author>
	    <updated>2009-01-23T16:28:46Z</updated>
	    <published>2009-01-23T16:28:46Z</published>
	    <content type="html">
	    	&lt;P&gt;1. 문제발생 원인&lt;BR&gt;&lt;BR&gt;HTTP 헤더에 접근 가능한 사용자가 지정되어 있지 않아 발생하는 문제이다. 주로, 인터넷정보설정(IIS)를 &lt;FONT face=verdana,arial,helvetica,sans-serif&gt;Visual Studio&lt;/FONT&gt; 보다 나중에 설치했을 경우 발생한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;2. 문제해결방법&lt;BR&gt;&lt;BR&gt;IIS 메타베이스에 접근 가능한 사용자를 추가한다.&lt;BR&gt;&lt;BR&gt;1) IIS 메타베이스에 접근 가능한 사용자 알아보기&lt;BR&gt;&lt;BR&gt;&amp;nbsp; (1) 다음 경로로 이동한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;제어판&lt;SPAN lang=EN-US&gt; -&gt; &lt;/SPAN&gt;성능 및 유지 관리&lt;SPAN lang=EN-US&gt; -&gt; &lt;/SPAN&gt;관리 도구&lt;SPAN lang=EN-US&gt; -&gt; &lt;/SPAN&gt;컴퓨터관리&lt;SPAN lang=EN-US&gt; -&gt; &lt;/SPAN&gt;시스템 도구&lt;SPAN lang=EN-US&gt; -&gt; &lt;/SPAN&gt;로컬 사용자 및 그룹&lt;SPAN lang=EN-US&gt; -&gt; &lt;/SPAN&gt;사용자&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;IWAM_계정이름으로 시작하는 이름을 선택하여, 메모해둔다&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #faffa9&quot;&gt;※ IWAM_계정이름&lt;BR&gt;IIS 메타베이스 접근권한을 줄 계정으로, IIS 프로세스를 시작시키기 위한 식별자 계정&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;2) 설정 작업&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;(1)&amp;nbsp;다음은 명령 프롬프트에 입력하는 명령어이다.&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;FONT face=verdana,arial,helvetica,sans-serif&gt;cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727&lt;/FONT&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;BR&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;FONT face=verdana,arial,helvetica,sans-serif&gt;aspnet_regiis.exe -ga iwam_계정이름&lt;/FONT&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;BR&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;FONT face=verdana,arial,helvetica,sans-serif&gt;aspnet_regiis -i&lt;/FONT&gt;&lt;/DIV&gt;
&lt;P&gt;만약 설치가 제대로 되지 않는다면, &lt;FONT face=verdana,arial,helvetica,sans-serif&gt;aspnet_regiis –e&lt;/FONT&gt; 로 삭제하고, 다시 설치한다. 
&lt;DIV class=autosourcing-stub&gt;
&lt;P style=&quot;PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: normal; FONT-SIZE: 12px; PADDING-BOTTOM: 0px; MARGIN: 11px 0px 7px; PADDING-TOP: 0px; FONT-STYLE: normal; FONT-FAMILY: Dotum&quot;&gt;&lt;STRONG style=&quot;PADDING-RIGHT: 7px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px&quot;&gt;[출처]&lt;/STRONG&gt; &lt;A href=&quot;http://blog.naver.com/gg1052/10010841665&quot; target=_blank&gt;&lt;FONT color=#800080&gt;IIS 메타베이스에 액세스하지 못했습니다 &lt;/FONT&gt;&lt;/A&gt;&lt;SPAN style=&quot;PADDING-RIGHT: 7px; PADDING-LEFT: 5px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px&quot;&gt;|&lt;/SPAN&gt;&lt;STRONG style=&quot;PADDING-RIGHT: 7px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px&quot;&gt;작성자&lt;/STRONG&gt; &lt;A href=&quot;http://blog.naver.com/gg1052&quot; target=_blank&gt;&lt;FONT color=#0000ff&gt;올드보이&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;/DIV&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>bitArray대신</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/kihwanny/125"/>
		<id>tag:blog.daum.net,2009:kihwanny.125</id>
	    <author>
		    <name>기화니</name>
	    </author>
	    <updated>2009-01-16T16:48:39Z</updated>
	    <published>2009-01-16T16:48:39Z</published>
	    <content type="html">
	    	&lt;P&gt;윤 사장님...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOOP.C&amp;nbsp; */&lt;BR&gt;#define _LOOP_&lt;BR&gt;#include &quot;gvar.h&quot;&lt;/P&gt;
&lt;P&gt;void Key_in();&lt;BR&gt;&lt;FONT color=#013add&gt;bit getBit(uchar i);&lt;BR&gt;void setBit(uchar i, bit bitTmp);&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;void loop(void) {&lt;BR&gt;uchar&amp;nbsp;i;&lt;BR&gt;&amp;nbsp;Com_ENB = Desable;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* 통신 Desable */&lt;BR&gt;&amp;nbsp;DIN_ENB = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* I/O Port Desable */&lt;BR&gt;&amp;nbsp;EA=1;&lt;BR&gt;&amp;nbsp;ES=1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Enable Serial int. */&lt;BR&gt;&amp;nbsp;ET0=1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Enable Timer0 int. */&lt;/P&gt;
&lt;P&gt;&amp;nbsp;RxFlag = 0;&lt;/P&gt;
&lt;P&gt;/* 각 Port 초기화 */&lt;BR&gt;&amp;nbsp;P1 = 0xff;&lt;BR&gt;&amp;nbsp;RxOk = 0;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;FONT color=#013add&gt;/*초기화만 할 거라면 그냥...*/&lt;BR&gt;&amp;nbsp;Key_Bit[0]=Key_Bit[1]=Key_Bit[2]=Key_Bit[3]=Key_Bit[4]=Key_Bit[5]=Key_Bit[6]=Key_Bit[7]=0;&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;for(i = 0; i &lt;= 7; i++ ){&lt;BR&gt;&amp;nbsp;&amp;nbsp;Fswitch_cnt[i]=0;&amp;nbsp;/* Clear Key Statu */&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #d9d8d8&quot;&gt;&amp;nbsp;&amp;nbsp;switch(i){&amp;nbsp;/***** 생각 하셨던 바 데로 됐는지&amp;nbsp; ?&amp;nbsp; ***********/&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 0:&amp;nbsp;Key_Bit[0] = 0; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 1:&amp;nbsp;Key_Bit[1] = 0; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 2:&amp;nbsp;Key_Bit[2] = 0; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 3:&amp;nbsp;Key_Bit[3] = 0; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 4:&amp;nbsp;Key_Bit[4] = 0; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 5:&amp;nbsp;Key_Bit[5] = 0; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 6:&amp;nbsp;Key_Bit[6] = 0; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 7:&amp;nbsp;Key_Bit[7] = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;Long_loop:&lt;BR&gt;&amp;nbsp;if(RxOk){&lt;BR&gt;&amp;nbsp;&amp;nbsp;Com_ENB = Desable;&amp;nbsp;&amp;nbsp;/* 통신 Desable */&lt;BR&gt;&amp;nbsp;&amp;nbsp;TxData();&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Rx OK 응답 */&lt;BR&gt;&amp;nbsp;&amp;nbsp;Com_ENB = Enable;&amp;nbsp;&amp;nbsp;/* 통신 Enable */&lt;BR&gt;&amp;nbsp;&amp;nbsp;RxOk = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;RxFlag = 0;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;goto Long_loop;&lt;BR&gt;}&lt;BR&gt;/*************** 구현해야할 기능 ****************/&lt;BR&gt;&lt;FONT color=#013add&gt;bit getBit(uchar i) {&lt;BR&gt;bit bitTmp;&lt;BR&gt;&amp;nbsp;switch(i){&amp;nbsp;/***** 생각 하셨던 바 데로 됐는지&amp;nbsp; ?&amp;nbsp; ***********/&lt;BR&gt;&amp;nbsp;&amp;nbsp;case 0:&amp;nbsp;bitTmp=Key_Bit[0]; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;case 1:&amp;nbsp;bitTmp=Key_Bit[1]; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;case 2:&amp;nbsp;bitTmp=Key_Bit[2]; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;case 3:&amp;nbsp;bitTmp=Key_Bit[3]; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;case 4:&amp;nbsp;bitTmp=Key_Bit[4]; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;case 5:&amp;nbsp;bitTmp=Key_Bit[5]; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;case 6:&amp;nbsp;bitTmp=Key_Bit[6]; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;case 7:&amp;nbsp;bitTmp=Key_Bit[7];&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;return bitTmp;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#013add&gt;void setBit(uchar i, bit bitTmp) {&lt;BR&gt;&amp;nbsp;switch(i){&amp;nbsp;/***** 생각 하셨던 바 데로 됐는지&amp;nbsp; ?&amp;nbsp; ***********/&lt;BR&gt;&amp;nbsp;&amp;nbsp;case 0:&amp;nbsp;Key_Bit[0]=bitTmp; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;case 1:&amp;nbsp;Key_Bit[1]=bitTmp; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;case 2:&amp;nbsp;Key_Bit[2]=bitTmp; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;case 3:&amp;nbsp;Key_Bit[3]=bitTmp; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;case 4:&amp;nbsp;Key_Bit[4]=bitTmp; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;case 5:&amp;nbsp;Key_Bit[5]=bitTmp; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;case 6:&amp;nbsp;Key_Bit[6]=bitTmp; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;case 7:&amp;nbsp;Key_Bit[7]=bitTmp;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;void Key_in(){&lt;BR&gt;uchar i,j;&lt;BR&gt;&lt;FONT color=#013add&gt;bit bitTmp;&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;DIN_ENB = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* I/O Port Enable */&lt;BR&gt;&amp;nbsp;Fswitch_data = 0;&lt;BR&gt;&amp;nbsp;j = 1;&lt;BR&gt;&amp;nbsp;for(i = 0; i &lt;= 7; i++ ){&lt;BR&gt;&amp;nbsp;&amp;nbsp;P1 = i;&lt;BR&gt;&lt;FONT color=#013add&gt;&amp;nbsp;&amp;nbsp;bitTmp = getBit(i);&lt;BR&gt;&amp;nbsp;&amp;nbsp;if( bitTmp== P1.5 ){&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Fswitch_cnt[i]++;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*bit크기는 1보다 클 수 가엾는데...아래는 오류로 보입니다...*/&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if( bitTmp &gt;= 10) if(bitTmp) Fswitch_data |= j;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;else{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Fswitch_cnt[i] = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;bitTmp = bitTmp ^ 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;setBit(i, bitTmp);&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;j &lt;&lt;= 1;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;BR&gt;&lt;/P&gt;&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0NMjX&amp;amp;tagName=8031&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;8031&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0NMjX&amp;amp;tagName=bit array&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;bit array&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0NMjX&amp;amp;tagName=bitArray&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;bitArray&lt;/a&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>Perl이야기&lt;펌&gt;</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/kihwanny/123"/>
		<id>tag:blog.daum.net,2009:kihwanny.123</id>
	    <author>
		    <name>기화니</name>
	    </author>
	    <updated>2009-01-09T16:25:27Z</updated>
	    <published>2009-01-09T16:25:27Z</published>
	    <content type="html">
	    	천리안에서 퍼온 것입니다.perl 강좌에 도움을 줄것입니다.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;안녕하세요 유니텔의 intour 나우누리의 필lit 전종필입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 저의 Perl이야기&amp;nbsp; 1, 2, 3,&amp;nbsp; 4를 읽어 주신&amp;nbsp; 여러분께 감사드립니다. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Perl이야기 5편을 시작하다가 갑자기&amp;nbsp; 그 동안 적었던 이야기들을 되&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 돌아 보고 싶더군요. 그래서&amp;nbsp; 노동절을 전후하여 저의 Perl이야기 1, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2, 3, 4를&amp;nbsp; 모두 훑어 보았습니다. 그랬더니,&amp;nbsp; 정말 너무 부끄럽더군&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 요. 제 실력을&amp;nbsp; 스스로도 잘 아는 바이지만, 오자,&amp;nbsp; 부족한 설명, 잘 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 못된 예제....&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 그래서 만사 제쳐놓고 수정, 보완한 합본을 만들었습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 부산에 계시는&amp;nbsp; 유니텔의 챌린저님께는 특별히&amp;nbsp; 더 죄송합니다. 저의 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 졸작을 프린트까지 하셨는데 이제야 보정판을 올렸으니 말입니다. 그 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 외에 그런분이 또 계시다면, 다시 한번, 아울러 사죄하는 바입니다.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;보충, 정정에 덧붙여...&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 설명이 너무 간략한 것들은&amp;nbsp; 보충을 하였고 오자는 발견된대로 정정하였습니다. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이러한 것은 치명적인 것이 아니기에 여기에 모두 적는것은 피하겠습니다. 단지 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 아래처럼 잘 못된 예제, 설명 등은&amp;nbsp; 제가 자칫 두들겨 맞을수도 있기에 미리 자&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 수하는 바입니다. 광명이 보이는군요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (1) &quot;9. PERL에서의 연산자(operator) - 논리 연산자&quot;의 뒷부분에 보면&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a &lt;= $b || $max = $a;&amp;nbsp; # C라면 if( a &gt; b ) max = a; 겠지요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 가 있습니다. 이&amp;nbsp; 식은 잘못되어 있습니다.왜냐하면 연산자&amp;nbsp; =는 ||보다 계산상 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 우선 순위가 늦습니다. 그래서&amp;nbsp; 위의 명령은 $a &lt;= $b ||&amp;nbsp; $max 가 먼저 계산이 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 됩니다. 그 다음의 = $a 부분은 쓰레기이지요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 수정된 식은&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a &lt;= $b || ($max = $a);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 입니다. 잘 못된 예제에 사과 말씀 드립니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (2) not, xor, and, or등의 논리연산자는 Perl 5.x에서부터 사용됩니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (3) 파일 다루기중&amp;nbsp; 파일에 쓰기에 관한 이야기에서&amp;nbsp; console인 STDIN에 쓴다고 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 잘 못 설명하였습니다. STDIN을 STDOUT으로 정정하였습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (4) 문자열의 일치에 대한 설명중 대소문자 구분을 하지 않도록하는 옵션인 i옵&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 션에 대해 이야기&amp;nbsp; 하면서 &quot;/the/뒤에 i 자 하나가&amp;nbsp; 매미처럼 붙어 있죠 ?&quot;라고 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 하는 부분이 있습니다. 이 중 the를 World로 정정합니다.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Perl의 소스를&amp;nbsp; 번역, 실행해주는 interpreter는 아래의&amp;nbsp; 장소에 올려져 있습니&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다. 아직 받지 않으신분들은 받으셔서&amp;nbsp; 프로그램을 직접 만들어 보세요. 재미있&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 유니텔: 공개자료실-인터넷통신자료 310번 - 도스용 4.x&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 유니텔: 공개자료실-인터넷통신자료 304번 - Win95용 Beta3&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 나우누리: 공개자료실-프로그래밍-유틸리티 107번 - 도스용 4.x&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 나우누리: 공개자료실-프로그래밍-유틸리티 108번 - Win95용 Beta3&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ========================================================&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;==========================&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Perl언어 이야기.&lt;BR&gt;==========================&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PERL은 PRACTICAL EXTRACTION AND REPORT LANGUAGE라는 INTERPRETER로서 문서파&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 일을 읽고 필요한 정보들을&amp;nbsp; 추출(EXTRACTION), 그 정보들을 바탕으로 REPORT를 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 출력하는 일을 하는데 아주 잘 맞는 언어입니다. 유닉스 플랫폼의 깡통들에서는 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 시스템 관리를 위하여 사용하기도 한다는데,&amp;nbsp; 저는 유닉스라고는 LINUX를 한 열&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 흘정도 쓰다가 X-WINDOW를 까는데 결국 실패한 죄로 유닉스는 겨우 냄새밖에 맡&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 지 못한 사람이라 그 쪽에서는 사용을 해보지 못했습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C++언어를 조금 공부한 일이 있어서&amp;nbsp; PERL을 배우는데 도움이 되었습니다. 사실 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '배운다'할 것까지도 없지만요....&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PERL의 도사들(미국살람, 영국살람, 등등)은 이 언어가 C, sed, awk, sh등의 특&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 징들을 결합한 것이어서 그러한 언어를 아는 사람들은 배우기가 쉽다고 하는데, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 굳이 그런 정도가 아니라도 배우는데 큰 지장은 없으리라 봅니다. 우리 나라 사&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 람들 머리가 어디 보통입니까 ?&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 근래 Internet의 부상과 더불어 혜성처럼 나타난 WWW, 그리고 홈 페이지 작성에 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 대한 열기,&amp;nbsp; 심지어는 어린이에게도 인터넷을&amp;nbsp; 교육환경으로 제공하려는 최근의 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 노력들을 감안할 때, 홈 페이지&amp;nbsp; 작성을 위하여 HTML만을 사용한다는 것은 분명 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 부족한 감이 많습니다. CGI (COMMON&amp;nbsp; GATEWAY INTERFACE)를 말하고자 하는 겁니&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WWW의 CGI구현에는 여러 방법이 있을&amp;nbsp; 수 있겠지요. 그중 하나인 .EXE파일을 만&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 들어서 하는 방법은 COMPILER를 사용하며 또 매우 정교한 재주를 사용해야 하기 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 때문에 구현과 DEBUGGING에 매우 많은&amp;nbsp; 시간이 필요하고 또 소스를 고칠 때마다 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; COMPILE을 반복하는 일 때문에 아주 짜증이 나기도 합니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다른 방법으로는 COMPILE이 아닌&amp;nbsp; INTERPRETING을 하는 언어를 사용하는 것인데 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; COMPILER로 만든 .EXE 파일보다 느리기는&amp;nbsp; 하지만 그다지 큰 프로그램이 아니고&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 서는 큰 차이를 느낄 수 없는 데다 DEBUGGING후 실행까지의 시간이 가히 '눈 깜&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 짝할 새'라서 정말 실용적이라 할 수 있겠습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PERL은 더구나 HTML과 같은 문서를 다루는데 아주 강력한 기능을 가지고 있으므&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 로 CGI구현을&amp;nbsp; 위한 최적의&amp;nbsp; 언어라 할&amp;nbsp; 수 있으며,&amp;nbsp; UNIX, MVS,&amp;nbsp; VMS, MS-DOS, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Macintosh, OS/2, Amiga, Windows NT 등 여러 가지 Operating system에 Porting&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 되어 있으므로 소스파일의 이식성이 뛰어나&amp;nbsp; 홈 페이지 구성 시에 차후 서버 프&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 로그램이나 Operating system의 변화에도 부담을&amp;nbsp; 주지 않아 좋고, 또 PERL프로&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 그램 자체가 프리웨어인 관계로 Internet상에서&amp;nbsp; 얼마든지 구할 수 있으니 그야&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 말로 꿩 먹고 알 먹고 둥지 털어 불쏘시개까지 하는 식이지요. (물론 진짜 그렇&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 게는 하지 않습니다. 환경을 살려야죠...)&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 자바가 어쩌고,,, 이런 세상에 웬&amp;nbsp; 구석기형의 언어냐고 타박하실 분도 계실 줄 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 압니다. 그러나 생각해 보십시오. 자바가&amp;nbsp; 소위 '경향'인 것은 틀림없지만 현재 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 주류라고 할 수 있을까요 ?&amp;nbsp; 자바는 32 비트 기반의 o/s에서 브라우징이 가능한 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 것으로 알고 있습니다. 우리 나라에서&amp;nbsp; 개인을 제외한 기업, 특히 중소기업들의 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 대부분의 업무환경이 32 비트 오퍼레이팅 시스템일까요 ? 첨단 기술을 습득하고 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 보조를 맞추어 가야 하는 것은 컴퓨터 하는 사람의 자세임이 틀림없지만 여러분&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 의 홈 페이지에 접속할 수많은 잠재 고객들의 사정을 가늠해 보는 것은 또한 비&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 지니스 맨의 의무입니다.&amp;nbsp; 아직도, 그리고 향후 얼마동안은,&amp;nbsp; 16 비트 환경에서 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 일하는 여러분의 고객들을 생각하시고 perl을 그냥 지나치지 마십시오.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C, C++같은 언어를 써보신 분들은&amp;nbsp; 그 언어에서 문자열과 메모리의 관리가 얼마&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 나 짜증나는 일인지 아실 겁니다. PERL은 그런 게 없어요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 여러 번에 걸친 debugging으로&amp;nbsp; 완벽해진 Perl 프로그램을 실행파일로 전환하고 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 싶을 때가 오면 어떡하느냐고요 ? Internet상에서 찾으면 Perl compiler도 있습&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 니다. 때가 되면 찾아보세요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 장점을 들려면 한이 없으니 이 정도에서 그쳐야겠습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 읽어 가시면서 의문 나는 점이나 잘못된 점 지적해주시면 감사하겠습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 앞으로의 이야기는&amp;nbsp; 전후가 중복되는 것이라도 필요하면&amp;nbsp; 다시 적도록 하겠습니&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다. 그래서 가능한 읽어나가면서 전의&amp;nbsp; 내용을 뒤적이지 않도록 하려합니다. 물&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 론 보장은 없지만....&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 덧붙일 말쌈은 저의 Perl 이야기는 언어의 기초를 다지는 정도에서 그칠 것이고 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 그 이상의 이야기는 저의 실력이 늘고 또 기회가 생기면 다시 시작될 수 있겠다&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 는 겁니다. 하오니&amp;nbsp; 기초를 넘어선 이야기는 스스로&amp;nbsp; 공부하시고 당분간은 묻지 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 말아달라는 부탁입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 감사합니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *** 도스용 PERL을 PKUNZIP 하실때는&amp;nbsp; ROOT DIRECTORY에서 -d 옵션을 주고 하신&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 후 생성되는 DIRECTORY이름을 NCD와 같은&amp;nbsp; 것을 이용하여 PERL이라고 재명명 해&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 주세요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 전 종 필 (나우: 필lit&amp;nbsp; 유니: intour, intour@unitel.co.kr)&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;1. 첫 번째 프로그램 - Hello World.&lt;BR&gt;=================================&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 언제나 그렇듯이 첫 프로그램은 바로 이겁니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # hello.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Hello World\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이 것이 프로그램의&amp;nbsp; 전부. print는 다음의 문자열, 숫자,&amp;nbsp; 변수 등을 STDOUT에 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 출력합니다. 참 쉽군요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \n : C++의 \n과 같은 역할로써 커서를 다음줄 앞으로 보내는 겁니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (new line)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;nbsp; : 이 문자 이후부터 끝까지는 perl로부터 무시됩니다. 주석문이죠.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 주석문을 잘 써 놓으면 나중에 프로그램을 읽을 때 쉽게 이해가 되겠죠.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp; : 한 명령문은 언제나 ;(colon)으로 끝납니다. 이것이 빠지면 다음 명령&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 라인에 error가 발생합니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hello.pl은 짐작하시다시피 평범한&amp;nbsp; ascii 파일(text파일)입니다. 따라서 dos의 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; edit와 같은 프로그램으로 편집하면 되겠죠.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;2. 그래서, 그 파일을 어쩌란 말이냐 ?? - perl 프로그램의 실행.&lt;BR&gt;=============================================================&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dos prompt상에서,&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; perl hello.pl &lt;ENTER&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 하면 됩니다. 물론 perl.exe가 PATH환경이나&amp;nbsp; 현재 directory에 있다는 가정 하&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 에서죠. 그러면 화면상에,&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\PERL&gt;perl hello.pl&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Hello World&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\PERL&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이라고 되겠지....우 !&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ******( Windows NT에서의 실행 )******&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows NT에서는 install.cmd를 실행시키고 난 후에 perl hello.pl이라고 하면 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 문제없이 실행이 됩니다. 도스창을 열고 실행해 보세요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *************************************&lt;BR&gt;&lt;BR&gt;3. 악 ! 근데 이건 머시냐 ??? - 첫 ERROR MESSAGE ??.&lt;BR&gt;=============================================&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DOS/4GW Professional Protected Mode Run-time&amp;nbsp; Version 1.97&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Copyright (c) Rational Systems, Inc. 1990-1994&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DOS용 PERL은 1&amp;nbsp; Mbytes의 한계를 극복하고 원활한 실행을&amp;nbsp; 돕기 위한 Rational &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Systems,&amp;nbsp; Inc의&amp;nbsp; DOS&amp;nbsp; EXTENDER를&amp;nbsp; 사용합니다. 위의&amp;nbsp; 출력내용은&amp;nbsp; 단순히&amp;nbsp; 그 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; product의 선전내용일 뿐이니 문제 될 것은 없지만 그다지 매일 보고 싶은 것은 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 아니겠죠. 참을 수 없는 사람들은:&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET DOS4G=QUIET&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 하면 조용해집니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 또, 어떤 경우에는&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DOS/4GW Professional fatal error (1307): not enough memory&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 라는 Message가 나오고 실행이 전혀 되지&amp;nbsp; 않을 수도 있는데, 이 것은 아마 EMS &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 그리고/또는 Smartdrv가 차지하고 있는&amp;nbsp; Memory부분을 DOS EXTENDER가 껄떡대다&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 가 한대 두들겨 맞고서 내는 신음소리일 겁니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 저의 경우&amp;nbsp; 총 16메가의&amp;nbsp; 메모리를 쓰고, EXPANDED&amp;nbsp; MEMORY 1&amp;nbsp; MByte, SMARTDRV &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1MByte를 사용하기 때문에 1 MByte의&amp;nbsp; 여유를 갖고서 4M의 주소부터 16M의 주소&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 까지를 EXTENDER가 사용하도록 아래처럼 지정하였습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET DOS16M=@4M-16M&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 자세한 내용은 README.DOS를 보시면 됩니다. (사실 저는 제가 필요한 것 이외는 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 자세히 읽지 않았거든요...)&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 참고로 Windows NT에서는 INSTALL.CMD를 실행시켜 주는것으로 문제가 없더군요.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;4. 변수(VARIABLE)&lt;BR&gt;=================&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PERL의 변수는 크게 3 가지로 나누어집니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. scalar variable.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. array.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. associative array. (hash)&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; scalar 변수는 변수명 앞에 $를 붙이는 변수로 굳이 말하자면 일반 변수라 하는 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 게 좋을 것&amp;nbsp; 같습니다. scalar라는 것은 '실수(實數)로 표시할&amp;nbsp; 수 있는 수량', &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 방향성이 없는 수량 같은 것인데 다른 언어에서처럼 정수형, 왕정수형, 실수형, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 왕실수형 (헹님요....) 등과 같은 엄격한 구분 없이 모든 숫자가 실수형으로 저&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 장이 되는 듯(?)하며(체계적으로 배운&amp;nbsp; 게 아니니 용서바람.), 심지어는 문자열&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 도 저장이 되는, 조금은 헷갈릴지&amp;nbsp; 몰라도, 매우 편리한 변수형태 입니다. 따라&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 서&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $price = 100000;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;$price\n&quot;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # &lt;- '\n'이 new line이라고 말했슈.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $price = &quot;Very expensive.&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;$price\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 에서와 같이 숫자를 할당했던 변수에 문자열을 재 할당해도 전혀 문제가 안됩니&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다. 신나는군요. 약간 이상한 게 눈에 뜨입니까 ? 일단 넘어가세요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 또 Perl의 변수에는 문자열로 저장된&amp;nbsp; 숫자형태의 변수, 즉 1000이 아닌 &quot;1000&quot;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 도 계산식에 그대로 적용시킬 수 있다는점이 아주 재미있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $price = &quot;130&quot;;&amp;nbsp; # 모양은 숫자이지만 실제는 문자열입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $double = $price * 2;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;$double\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위의 소스를 실행시켜 보세요. 이게 에러가 없다니까요, 글쎄 !&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이런 변수의&amp;nbsp; 특성은 여러분의 프로그램이 사용자로부터&amp;nbsp; 받은 자료를 계산식에 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이용할 때 다른&amp;nbsp; 언어에서처럼 숫자로 변환하는 함수 등을&amp;nbsp; 사용하지 않고 즉시 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 계산에 사용할 수 있게하겠지요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; array는 배열입니다. 일종의 집합체, 구조체 같은 것입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 배열이란 복수의&amp;nbsp; 일반변수들을 변수 각각의 이름이&amp;nbsp; 아닌 참조번호를 이용하여 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 접근할 수 있도록 굴비 엮듯&amp;nbsp; 줄줄이 엮어놓은 것입니다. 즉 &quot;전종필&quot;이라고 부&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 르지 않고 &quot;58번&quot;하고 부르는것이겠지요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 배열의 머리에는 $가아닌 달팽이(@)를 붙입니다. 즉,&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @myarray;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 와 같습니다.&amp;nbsp; 또 배열의 구성요소는&amp;nbsp; 일반변수(scalar)이므로 개개 구성요소를 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 나타낼 때는&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myarray[0] = 0;&amp;nbsp;&amp;nbsp; # 0번 굴비에게는 파리 0마리,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myarray[1] = 5;&amp;nbsp;&amp;nbsp; # 1번 굴비는 1마리의 파리를 드리겠어요오오.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myarray[2] = &quot;I do not want a number but a long long long string.&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myarray[3] = 300; # 배 트자뿌겠네 !&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $myarray[2], &quot;\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;$myarray[2]\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 과 같이 나타냅니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 굴비가 몇 마리인지는 세어보면 알겠지만 배열의 크기를 알아야 할 때는 눈으로 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 셀 수 없지요. 그 때는&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $lastIndex = $#myarray;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 처럼 하면 @myarray의 맨 마지막&amp;nbsp; 요소의 참조번호(index number)를 알 수 있습&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 니다. 즉 $lastIndex 또는 $#myarray의&amp;nbsp; 값이 3 이라면 배열의 첫 참조번호는 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이므로 요소의 갯수는 모두 4개인 셈입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 배열의 크기를 조절할 때에도 마지막 참조번호를 이용할 수 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $#myarray = 2;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 마지막 참조번호를 2로 맞추라 !&amp;nbsp; 찌아안...&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 라고 하면 $myarray[3]은 사라지고 3개의 요소만 남겨집니다. 조금은 희한한 방&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 법이지만 편리하기도 하지요. 물론 늘일 수도 있겠지요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Associative array는 hash라고도 하는 잡동사니 주머니입니다. 배열과 비슷하지&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 만 배열처럼 참조 번호가 아닌 참조 '열쇠'(key)로 값을 정하거나 찾을 수 있습&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 니다. 즉,&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @myarray = ( 1, 3, 5, 2, 6 );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $fourth = $myarray[3]; # 2&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %myhash = ( &quot;apple&quot;, 3, &quot;pear&quot;, 10, &quot;banana&quot;, 4, &quot;monkey&quot;, 2 );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $howmany = $myhash{ &quot;banana&quot; }&amp;nbsp; # returns 4&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $howmany = $myhash{ &quot;apple&quot; }&amp;nbsp;&amp;nbsp; # returns 3&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myhash{ &quot;pear&quot; } = 9;&amp;nbsp; # becomes ( ..., 3, &quot;pear&quot;, 9, &quot;bana...&amp;nbsp; )&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 여기까지 대략 변수에 대하여 알아보았습니다. 누워서 떡 먹기죠 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이제는 하나씩 문제를 만들어가 봅시다요.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;5. 화면에 쓰기 - print 함수&lt;BR&gt;===========================&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 우리의 첫 번째 프로그램인 hello.pl을 떠올려 봅시다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Hello World\n&quot;;가 전부였죠.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 좀더 긴 인사를 해볼까요 ?&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # heylong.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &lt;&lt;END_OF_HELLO; next friend Hello world.\n am here serve you not conquer. There were many kings and queens in the world, but I want to be a real of yours. ?Ending our greeting\n?; 조금 다르지만 똑똑하신 우리 대한의 아들 딸들은 알아 차리셨군요. 다음에 나오는 &lt;&lt;end_of_hello는 따라오는 문장을 print하는데 있어서 첫 end_of_hello (또는 정하는 무엇, THATSALL 이나 HE_HE_HE등)가 올 때까지 멈추지 않는 것이죠. 예제를 별도 저장해 드리고 않습니 자판을 두드려 보는 것은 문장의 구조를 손에 익게 하는 효과가 있다 고 생각되기에 귀중한 기회를 빼앗고 싶지 않은거지요. 인자인 문자열에는 변수가 삽입될 있습니다. 일반변수에 대하 여 이야기하던 중에 잠깐 나왔었죠. ?$price\n?; 에서 ?$price\n?안의 $price는 변수에 정해져있는 값으로 치환됩니 만약 $price가 였다면 135 이라고 결과가 나오지요. 그러나 문자열을 싸고있는 따옴표가 ?일 경우에는 다릅니다. $price\n 과 변수는 개행문자(\n)까지도 치환(확장)되지 문자 그대로 오는 현상이 발생합니다. 다음을 보시고 결과를 상상해 보세요. ?$price=', &quot;$price\n&quot;;&#13;&#10;&#13;&#10;     print 함수는 복수의 인자를 모두  인식하며, 각 인자는 쉼표(,)로 분리됩니다. &#13;&#10;     그래서 위의 명령행이 실행 되는 거지요.&#13;&#10;&#13;&#10;     한가지 더 있습니다. 역으로 찍히는 따옴표가 있지요 ? 자판의 ESC 누름쇠 바로 &#13;&#10;     밑에 ~와 함께 있는 ` 기호입니다.  이 기호에 둘러 쌓이면 그 문자열은 시스템 &#13;&#10;     명령으로 간주되어 실행 되어집니다. 그 결과가 print 되는 거지요.&#13;&#10;&#13;&#10;          print `cd`;&#13;&#10;&#13;&#10;     cd가 무슨 명령어인지는 다 아시죠 ? 직접 해 보세요.&#13;&#10;&#13;&#10;     배열(array)은 공백문자를 하나씩 끼워서  프린트가 됩니다. hash (associative &#13;&#10;     array, 잡동사니)는 치환이 되지 않아요.&#13;&#10;&#13;&#10;          @heys = ( &quot;Hello&quot;, &quot;there&quot;, &quot;I\' m?, ?O.K.?, ?\n? 달팽이는 array ?@heys?; 배열을 풀어봅시다. (;를 빼 먹으면 안돼는 것 아시죠 ?) %fruits=&quot;(&quot; ?apple?, 3, ?pear?, 5, ?banana?, %는 잡동사니 hash ! ?%fruits\n?; 될까요 결과는 상상해보세요. 상상이 안되시면 직접 실행시켜 보시고요. ******( 특수한 문자들을 문자열에 포함시키기 )****** 지금까지의 예문들을 가끔 이상한 기호를 안에 넣는 경우가 있었지요 예를 들면 같은것 말입니다. 보통 ??, ``로 둘러 쌉니다. 그렇다면 문자열 내에 따옴표들을 집어 넣으려면 조금은 방법을 써야겠지요. 그렇지 않고 ?.\n?; 하면 Perl은 에러 메시지를 내고 중지합니다. 왜냐하면 문자열은 The에서 시작하여 is뒤의 공백에서 끝나고 뒤는 문법에 맞지않는 쓰레기(\n?)이기 때문이죠. 그래서 ?The quotation mark \?.\n?; 와 같이하면 \?가 ?인것을 알고 순순히 실행이 됩니다. ?와 `의 경우도 마찬가 지입니다. 또 \n과 같이 문자의 모양이 지정되어있지 않은 문자들은 각기 다른 방법이 있 습니다. 단 슬래쉬(\)를 사용한다는 점이 같은점입니다. 다음은 그러한 특수문 자들입니다. 참고삼아 보십시오. \t 탭 \n 개행문자. 다음 줄 \r 커서를 현 라인의 맨 앞으로 보냄. \f form feed \v vertical tab, whatever that is \b backspace \a alarm (bell) 삐이. \e escape \033 octal \x1b hex \c[ control \l \u char \L lowercase \U uppercase end case modification \Q quote regexp metacharacters till \E 심심풀이 땅콩같은 예제 하나 드릴께요. # hack.pl $a=&quot;H   A   C   K   E   R       &quot; ; $len=&quot;(length&quot; $a)-1; ?$a\r?; 0..3 ) for ( 0..$len) { $s1=&quot;substr(&quot; 0, $_ $s2=&quot;substr(&quot; $a, $_+1 ); ?$s2$s1\r?; sleep 1; } ?\n?; *************************************************** 6. 함수와 CGI=&quot;==================&quot; print 함수의 쓰임새에 앞 주제에서 이야기했습니다. 그럼 ?CGI 최적?이 라는 PERL언어와 CGI는 어떻게 연관 지을 수 있을까요 ? 저는 여러분이 이미 HTML에 대하여 어느 정도 아시는 것으로 가정합니다. 다만 간단히 소개하면 같습니다. 페이지가 다음과 같다고 하지요. 그곳에 접속한 사용자는 마우스를 용하여 어떤 하이퍼 텍스트를 딸깍댑니다. 사용자의 웹 브라우저는 버에 해당하는 보내 줄것을 요청합니다. 서버는 파일이 HTML이나 이 미지 등이면 보내주고 exe, pl확장자를 가지고 파일이면 서버상에 서 실행을 시킨 후 그 출력을 보냅니다. 물론 여러분의 NT, Windows 95 나 OS 2 등에서 움직이고 있는 서버(HTTPS, WebSite 등)는 확장자가 pl인 의 소스 파일을 보면 perl.exe를 구동시켜 실행시킬 것입니다. unix 계열에서는 chmod명령으로 PERL 파일의 모드를 바꾸어 실행 파일로 설정하여 주어야 합니 다. &lt;html&gt;&lt;HEAD&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;H1&gt;홍길동과 108 장수들&lt;/H1&gt;
&lt;HR&gt;
&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 나는 홍길동이다.
&lt;P&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href=&quot;http://members.tripod.com/~bank123/strike.pl&quot;&gt;&lt;FONT color=#0000ff&gt;한 대 맞아 볼테냐 ?&lt;/FONT&gt;&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;!-- 물론 htm파일로도 되지만 교육상 ... --&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 아프지 ? 우하하하하 !!
&lt;P&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위의 HTML을 보고서 한 대 맞고 싶은 사용자는 &quot;한 대 맞아 볼테냐 ?&quot;에 마우스&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 를 대고 똑딱입니다. 그러면&amp;nbsp; 서버는 &quot;strike.pl&quot;파일을 찾아서 perl strike.pl&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 을 실행시킵니다. 물론&amp;nbsp; perl.exe는 path로 지정되어 있는&amp;nbsp; 경로에 있어야 합니&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다. strike.pl은 이렇게 생겼을 겁니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # strike.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Content-type: text/html\n\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 위의 명령행은 반드시 들어가야하는 내용입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 그래야 browser가 html 파일임을 알아 볼 테니까요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &lt;&lt;ENDOFHTML; &lt;html&gt;&lt;HEAD&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;H2&gt;백 아홉대를 맞아랏 !&lt;/H2&gt;
&lt;HR&gt;
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 왜냐하면 홍길동 보태기 백 여덟 장사면 백 아홉명 이니까.
&lt;P&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 자, 맞아랏 !
&lt;P&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; endOfHtml&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for( $i = 0; $i &lt; 109; $i++ ) # 내용을 109번 반복. 나중에 또 설명.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;따악 &quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; # 109번을 따악 따악 따악 따악 따악 따악 따악 !!!&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;
&lt;P&gt;&quot;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;아프지 ?&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 웹서버 프로그램은 print되는 내용을&amp;nbsp; browser로 보냅니다. 결과는 상상해 보세&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 일단은 이 정도만 알아 두셔도 될&amp;nbsp; 듯 합니다. 앞으로는 꼭 필요한 경우를 제외&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 하고는 굳이 cgi는 언급하지 않겠습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ******( 참고 )******&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PERL은 소스파일을 읽어&amp;nbsp; 들인 후 일단 처음부터 끝까지&amp;nbsp; 기계어로 번역을 합니&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다. 그리고는 매우 빠른 속도로 실행을 시킵니다. perl.exe로 실행을 시켜볼 때 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 실행 직전까지 약간의 멈춤 시간을 느낄 수 있는 것은 바로 완전한 번역을 위해 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 약간의 시간이 소요되기 때문입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 프로그램에 버그가 있을 때는 그&amp;nbsp; 앞의 명령행 어느 하나도 실행되지 않고 즉시 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 오류 메세지가 나오는 것도 실행 전에 완전히 번역을 해 놓기 때문입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ********************&lt;BR&gt;&lt;BR&gt;7. PERL의 연산자(operator) - 숫자 계산&lt;BR&gt;======================================&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $b = 3;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # = 는 같다는 뜻이 아닌 할당, 저장의 의미입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 즉, $b에 3이라는 값을 저장.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $b = $a;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # ...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $b = @a;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 일반변수 $b에 배열 @a를 저장. 배열&amp;nbsp; $a의 모든요소&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 들이 그대로 간격없이 순서대로 연결되어 저장.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $b = &quot;@a&quot;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 일반변수 $b에 배열 @a를 저장. 배열&amp;nbsp; $a의 모든요소&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 들이 하나의 공백을 사이에 두고 순서대로 연결되어&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 저장.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @b = @a;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 배열 @b에 배열 @a를 저장. 배열&amp;nbsp; $a의 모든요소&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 들이 그대로 @b에 저장됨.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %b = %a;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # hash %b에 hash %a를 저장.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $b = $a = 3;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # $a, $b에 3을 저장.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ### 위의 식들을 직접 실험해 보세요. 어떤 결과가 나오는지 직접&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ### 체크해 보시기 바랍니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a = 10 + 3;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 10과 3을 더하여 $a에 저장.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a = 3 - 10;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 3에서 10을 뺀 후 $a에 저장.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a = 3 * 10;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 곱하기.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a = 3 / 10;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 3 나누기 10.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a = 2 ** 3;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 2의 3승 (8). 주의: -2**3은 -(2**3)과 같음.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a = 10 % 3;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 10을 3으로 나눈 후의 나머지 값. ($a는 1).&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $b = ++$a;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # $a 값을 1 만큼 증가 시킨 후에 그 값을 $b에 저장.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $b = --$a;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # $a 값을 1 만큼 감소 시킨 후에 그 값을 $b에 저장.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $b = $a++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # $a 값을 $b에 저장한 후에 $a값을 1 만큼 증가.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $b = $a++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # $a 값을 $b에 저장한 후에 $a값을 1 만큼 감소.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $b += 13;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # $b의 값에 13을 더한 값을 $b에 저장.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $b -= 13;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # $b의 값에서 13을 뺀 값을 $b에 저장.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $b *= 13;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;nbsp;&amp;nbsp; 이하 설명 생략.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $b /= 13;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $b %= 13;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $b **= 13;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;8. PERL에서의 연산자(operator) - 문자열 계산&lt;BR&gt;============================================&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a = &quot;hello&quot; . &quot;world&quot;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # $a는 &quot;helloworld&quot;가 됨. 사이에 있는것은&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 점입니다. 일명, 쩜 !&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a = &quot;hello&quot; x 3;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # &quot;hellohellohello&quot;.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a = &quot;hello&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a .= &quot; world&quot;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # &quot;hello world&quot;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 증가 연산자의 마술 !&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print ++($foo = '99');&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # prints '100'&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print ++($foo = 'a0');&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # prints 'a1'&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print ++($foo = 'Az');&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # prints 'Ba'&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print ++($foo = 'zz');&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # prints 'aaa'&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 감소 연산자(--)는 증가 연산자가 피우는 재주를 모릅니다.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;9. PERL에서의 연산자(operator) - 논리 연산자&lt;BR&gt;============================================&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 논리 연산자는 어떤 조건이 참인지 거짓인지 판별할 때 사용합니다. 논리적 AND &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( &amp;&amp; )는 두 조건이 모두 참일 때 전체를 참으로 결정하고, 논리적인 OR ( || )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 는 두 조건이&amp;nbsp; 모두 거짓일 때 전체를 거짓으로&amp;nbsp; 결정합니다. 핵교 댕길때 다들 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 배우셨지요 ? Perl 언어에서도 0은&amp;nbsp; 거짓으로 보고 그외는 참으로 봅니다. 그래&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 서&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a = 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $b = 2;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $c = 0;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $d = $a &amp;&amp; $b;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # $d는 1; 참&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $d = $a &amp;&amp; $c;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # $d는 0; 거짓&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $d = $a || $b;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # $d는 1; 참&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $d = $a &amp;&amp; $c;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # $d는 1; 참&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 가 성립합니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 논리 연산자 (||, &amp;&amp;)의 재주부리기 :&amp;nbsp; || 는 앞과 뒤의 참 거짓을 바탕으로 전&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 체적 참 거짓을 판가름하는 연산자이지만,&amp;nbsp; 앞의 조건이 거짓일 때 뒤의 명령어&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 를 실행시키는 역할도 합니다. 물론&amp;nbsp; 앞의 조건이 참이면 전체가 참이므로 뒤의 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 명령어는 실행할 생각도 않습니다. 따라서 다음과 같은 명령이 가능합니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a &lt;= $b || ( $max = $a );&amp;nbsp; # C라면 if( a &gt; b ) max = a; 겠지요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 편리하지 않습니까&amp;nbsp; ? 위의 예제에서는&amp;nbsp; $a가 $b보다 작거나 같지&amp;nbsp; 않으면 뒤의 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $max = $a가 실행됩니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND 연산자 (&amp;&amp;) 또한 마찬가지입니다. &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a &gt; $b &amp;&amp; ( $max = $a );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 즉, $a가 참인 경우에 뒤의 ( $max = $a )도 참인지 시험하기 위해 ( $max = $a &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; )를 실행시키는 것입니다. 그 실행이 끝나고 난 후 전체식 $a &gt; $b &amp;&amp; ( $max = &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a )이 참인지 거짓인지 가늠되는데&amp;nbsp; 그 결과는 사용하던 안하던 여러분의 자유&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 겠지요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위의 예문에서 ( $max = $a )와 같이 ()를 사용한 것은 || 또는 &amp;&amp;이 = 보다 계&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 산시 우선 순위가 높기&amp;nbsp; 때문에 괄호를 사용하지 않고 $a &gt;&amp;nbsp; $b &amp;&amp; $max = $a와 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 같이 했을 때 $a&amp;nbsp; &gt; $b &amp;&amp; $max가 먼저 계산이&amp;nbsp; 되고 나중에 = $a라는 쓰레기만 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 남아서 에러 메시지가 나오고 실행되지 않는것을 막기 위해서입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 정리해서 말하면 위의 경우처럼 사용되는&amp;nbsp; ||는 &quot;그렇지 않으면&quot;의 뜻이고 &amp;&amp;는 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;그러할 경우에&quot;의 뜻이 되는것입니다.&lt;BR&gt;&lt;BR&gt;10. PERL에서의 연산자(operator) - 그 외&lt;BR&gt;=======================================&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,(comma) 연산자는 연속된 명령의 실행, 목록내에서는 요소간의 분리 등을 나타&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 냅니다. 그다지 중요한 것은 아니지만 가끔은 편리할 때가 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a = 1, $b = 3, print &quot;@a and @b\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &gt;, &lt;, &gt;=, &gt;=&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 숫자의 비교.&amp;nbsp; if ( $a &gt; $b ) { print &quot;O.K.&quot;; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ==, !=, &lt;=&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # &lt;=&gt;는 앞의 변수가 작으면 -1, 크면 1, 앞과 뒤의 변수가 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 같으면 0을 return합니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lt, gt, le, ge&amp;nbsp;&amp;nbsp;&amp;nbsp; # 문자열의 비교. &quot;ba&quot;는 &quot;bb&quot;보다 작습니다(lt).&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eq, ne,&amp;nbsp; cmp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;nbsp; cmp는 숫자의 &lt;=&gt;와&amp;nbsp; 같은 역할. az는&amp;nbsp; bb보다 작습니&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다.(-1)&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3 | 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;nbsp; bit계산용 OR.&amp;nbsp; 00000011 | 00000010 -&gt; 00000011 -&gt; 3&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3 &amp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;nbsp; bit계산용 AND. 00000011 &amp; 00000010 -&gt; 00000010 -&gt; 2&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3 ^ 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;nbsp; bit계산용 XOR. 00000011 ^ 00000010 -&gt; 00000001 -&gt; 1&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;11. 연산자의 우선 순위.&lt;BR&gt;=======================&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 한 명령행에서 여러 종류의 연산자가 사용되었을 때, perl.exe는 연산자들의 우&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 선 순위를 따져서 먼저 계산될&amp;nbsp; 부분을 결정하여 순서대로 계산을 합니다. 예를 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 들어 5 + 4 * 2 의 경우 앞의 5 + 4를 먼저 계산하는 것이 아니라 뒤의 4 * 2를 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 먼저 계산하고 그 다음에 5 + 8을 계산하는 것이지요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이 때 앞의 5 + 4를 먼저 계산 시키려면&amp;nbsp; ( 5 + 4 ) * 2 와 같이 괄호로 묶어주&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 어야만 합니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 우선 순위가 같은 연산자 끼리는&amp;nbsp; 앞의 연산자에 우선 순위가 있습니다. 어떻게 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 아느냐고요 ? 5 * 4 % 3 과 5 % 3 * 4를 각각 실행시켜 보십시오.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다음은 연산자 사이의 우선 순위입니다. ( perlop.txt 발췌 )&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left terms and list operators (leftward) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left -&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nonassoc ++ -- &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; right ** &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; right ! ~ \ and unary + and - &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left =~ !~ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left * / % x &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left + - . &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left &lt;&lt; &gt;&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nonassoc named unary operators &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nonassoc &lt; &gt; &lt;= &gt;= lt gt le ge &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nonassoc == != &lt;=&gt; eq ne cmp &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left &amp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left | ^ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left &amp;&amp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left || &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nonassoc .. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; right ?: &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; right = += -= *= etc. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left , =&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nonassoc list operators (rightward) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left not &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left and &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; left or xor &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위에 설명하지 않았던 연산자들이 많이 있죠 ? 일단은 접어 두고 가세요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 또, 연산자 not, and, or,&amp;nbsp; xor는 Perl 4.x에서는 없는 것들입니다. Perl 5.x에&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 서 사용가능한 연산자들이지요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 또 궁금해서 도저히 못 참으시는 분 들은 제가 올려드린 PERL 문서&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (perldocu.zip)중 perlop.txt를 찾아 보세요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ******( 한마디 )******&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 자바가 어쩌고,,, 이런 세상에 웬&amp;nbsp; 구석기형의 언어냐고 타박하실 분도 계실 줄 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 압니다. 그러나 생각해 보십시오. 자바가&amp;nbsp; 소위 '경향'인 것은 틀림없지만 현재 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 주류라고 할 수 있을까요 ?&amp;nbsp; 자바는 32 비트 기반의 o/s에서 브라우징이 가능한 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 것으로 알고 있습니다. 우리 나라에서&amp;nbsp; 개인을 제외한 기업, 특히 중소기업들의 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 대부분의 업무환경이 32 비트 오퍼레이팅 시스템일까요 ? 첨단 기술을 습득하고 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 보조를 맞추어 가야 하는 것은 컴퓨터 하는 사람의 자세임이 틀림없지만 여러분&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 의 홈 페이지에 접속할 수많은 잠재 고객들의 사정을 가늠해 보는 것은 또한 비&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 지니스 맨의 의무입니다.&amp;nbsp; 아직도, 그리고 향후 얼마동안은,&amp;nbsp; 16 비트 환경에서 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 일하는 여러분의 고객들을 생각하시고 perl을 그냥 지나치지 마십시오.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 참 돈 되는 일도 아닌데 제가 왜 이리 흥분인지 모르겠네요...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; **********************&lt;BR&gt;&lt;BR&gt;12. 파일 다루기&lt;BR&gt;===============&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 저런, 눈에 쌍꺼풀이 지시는군요. 지루한 연산자 이야기였습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 경우에 따라 여러분은 파일과 디렉토리를&amp;nbsp; 다루어야 할 때가 있으리라 생각됩니&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PERL의 파일 다루는 솜씨는 매우&amp;nbsp; 훌륭합니다. 파일의 상태 또는 이것이 파일인&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 지 디렉토리인지 알아내기 위해서 C와 같은 언어에서는 대개 int86x같은 시스템 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 의존적인 함수를 이용해야 합니다.&amp;nbsp; 그러나 PERL에서는 어떤 운영체제에서도 같&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 은 명령을 사용합니다. 단지 참조 메뉴얼이 옆에 있어야 한다는 것 뿐이죠.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 파일 및 디렉토리에 대해 알고 싶은 경우 다음과 같은 함수들을 사용합니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 기본적인 것들만 나열합니다.(perlfall.txt의 -X FILEHANDLE을 보십시오.)&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 문법: -X FILEHANDLE 또는 -X FILE_OR_DIR_NAME&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -e&amp;nbsp; 파일이 존재하는가 ? (참이면 1, 거짓이면 0을 리턴합니다.)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -z&amp;nbsp; 파일 크기가 0인가 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -s&amp;nbsp; 파일이 0 아닌 크기를 갖는가 ? (파일의 크기를 리턴합니다.)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -f&amp;nbsp; 파일이 평범한 파일인가 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -d&amp;nbsp; 파일이름이 디렉토리인가 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -T&amp;nbsp; 파일이 텍스트 파일인가 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -B&amp;nbsp; 파일이 이진 파일인가 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -M&amp;nbsp; 파일이 생성된지 몇일이 되었는가 ? ( 0부터 시작 )&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 그럼 파일을 한 번 읽어 봅시다.&amp;nbsp; 파일을 읽거나 쓰기 전에는 반드시 파일 핸들&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 을 생성, 파일을 '열어야' 하고, 다 읽은 후에는 '닫아야' 합니다. 파일 핸들에&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 는 변수들에 붙는 $, @, %같은 것들이 붙지 않습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # mytype1.pl&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 도스의 type, 유닉스의 cat 명령을 흉내내어 봅시다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $fileName = &quot;hello.pl&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( -d $fileName )&amp;nbsp; #&amp;nbsp; -d $fileName &amp;&amp; die &quot;$fileName ...&quot;;와 같음.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { die &quot;$fileName is a directory.\n&quot;; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 디렉토리를 type할 수는 없죠.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # die 함수는 메세지를 출력하고 프로그램 실행을 중단시킵니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -e $fileName || die &quot;$fileName is not exist.\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -T $fileName || die &quot;$fileName is not a text file.\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; open( fileHandle, $fileName ) || die &quot;Cannot open $fileName.\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @allLines = &lt;FILEHANDLE&gt;;&amp;nbsp;&amp;nbsp; # 핸들을 통하여 모든 문자열을 배열로&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 읽어 들입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 파일이 너무 크면 좀 문제가 있겠죠.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; close( fileHandle );&amp;nbsp; # 다 읽었으니 꼭 닫습니다. !!!!!&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print @allLines;&amp;nbsp; # 화면에 출력합니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 아주 간단하게 만들었죠 ?&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 문자열을 한 줄씩 읽을 수도 있습니다. 핸들을 배열에 할당(=)시키면 모든 문자&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 열이 다 읽히지만 일반 변수(scalar)에&amp;nbsp; 할당시키면 한 줄만을 읽고, 파일의 끝&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 에 도달했을 때에는 &quot;undefined value&quot;(정해지지 않은 값 ?)을 리턴 합니다. 이 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; undefined value는 조건식에서 사용하면 거짓으로 인식됩니다. 따라서,&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; open( fileHandle, $fileName ) || die &quot;Cannot open $fileName.\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while( $aLine = &lt;FILEHANDLE&gt; )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $aLine;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; close( fileHandle );&amp;nbsp; # 다 읽었으니 꼭 닫습니다. !!!!!&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 와 같이 하면 안전하게 파일의 끝까지&amp;nbsp; 한 줄씩 읽으면서 print할 수 있는 것이&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 지요. 파일의 크기가 너무 커서 메모리 사용이 과다할 것 같은 경우에는 이렇게 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 한 줄씩 읽어들이는것도 좋은 방법이겠지요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; open은 파일을 열고 close는 닫는 함수인데, open의 여는 동작은 다시 분류하여 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 생각할 필요가 있습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; open( fileHandle, &quot;&lt;HELLO.PL&quot; # ); ? ?hello.pl? hello.pl을 읽기 모드로 엽니다. open( fileHandle,&gt;&lt;HEAD&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;H1&gt;Test of writing file in PERL&lt;/H1&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Hello. I am writing something to a file.
&lt;P&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Be careful to close the file after completion of writing.
&lt;P&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END_HTML&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; close( fileHandle );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위에서 print 다음의 fileHandle다음에 comma가 없음을 유의해 주세요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 추가쓰기 모드는 따로 설명하지 않겠습니다. 숙제입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 여기까지 파일 다루기에 대하여&amp;nbsp; 간단히 살펴보았습니다. 다음은 디렉토리에 대&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 해 살펴보겠습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 하품하지 마세요.&lt;BR&gt;&lt;BR&gt;13. 디렉토리 다루기&lt;BR&gt;===================&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 디렉토리는 하위 디렉토리들과 파일들의&amp;nbsp; 명세서를 담고 있습니다. 여기서는 디&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 렉토리 사이를&amp;nbsp; 움직이는 것들보다는 디렉토리가 담고&amp;nbsp; 있는 명세를 들여다보는 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 것에 대하여 살펴보도록 하겠습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 파일에 핸들이 있듯이 디렉토리를 여닫는 데에도 핸들이 있습니다. 또 디렉토리&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 를 여닫을 때에는 opendir와 closedir함수를 사용합니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; readdir 함수는 디렉토리에 있는 모든&amp;nbsp; 디렉토리 및 파일들의 이름을 읽어 목록&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 형태(배열)로 리턴합니다. 즉&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @myArray = readdir( DirHandle );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 과 같이 하면 됩니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 백문이 불여 일견이고 백견이 불여 일행이라.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # readdir.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; opendir(dirHandle, &quot;.&quot;) || die &quot;Failed opening.\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @files = readdir( dirHandle );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; closedir dirHandle;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print @files;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 알아먹기 힘들게 프린트됩니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;@files&quot;;&amp;nbsp; # 이것은 볼만하지요 ?&amp;nbsp; 잠깐 말씀 드린 적이&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 있는데 배열이 치환될 때에 각 요소 사이에&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 공백이 하나씩 들어갑니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 읽혀진 파일 및 디렉토리 목록에서&amp;nbsp; 몇 가지만 골라서 쓰고 싶은 분도 계시겠지&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 나중에 또 기회가 있을 겁니다. 그&amp;nbsp; 때까지 못 기다리실 분들은 함수 grep에 대&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 해 찾아보세요. sort 함수도 볼 가치가 있습니다.&lt;BR&gt;&lt;BR&gt;14. 명령행 인자 - @ARGV 배열&lt;BR&gt;============================&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 파일 다루기와 디렉토리 다루기에서 한가지&amp;nbsp; 불만이 있었을 줄로 압니다. 왜 파&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 일 이름과 디렉토리 이름을 미리 정해놓고서 유용성을 축소 시키느냐고요...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 조금 더 우아하게, type myfile.htm할 수 있을 텐데 말입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 물론이지요. 좋은 질문입니다. 역시 민주 컴퓨터 쟁이는 다르군요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 명령행에 붙여지는&amp;nbsp; 인자는 @ARGV라는 배열에&amp;nbsp; 담겨져서 프로그램으로 넘겨집니&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 당연히 인자의 마지막 참조번호는 $#ARGV가 되겠지요. 인자가 하나도 없을 때에 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $#ARGV의 값을 출력 시켜보면 -1을 프린트합니다. 의심나면 직접 해 보세요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;$#ARGV\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이 한줄이면 됩니다. 그리고 perl test.pl, perl test.pl hey, 등을 해 보세요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 파일 다루기에서 만들었던 프로그램을 다시 짜봅시다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # mytype2.pl&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 도스의 type, 유닉스의 cat 명령을 흉내내어 봅시다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( $#ARGV &lt; 0 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { die &quot;Supply a file name, please.\n&quot;; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( $#ARGV &gt; 0 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { die &quot;Too many parameter.\n&quot;; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $fileName = shift( @ARGV );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( -d $fileName )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { die &quot;$fileName is a directory.\n&quot;; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 디렉토리를 type할 수는 없죠.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # die 함수는 메세지를 출력하고 프로그램 실행을 중단시킵니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -e $fileName || die &quot;$fileName is not exist.\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -T $fileName || die &quot;$fileName is not a text file.\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; open( fileHandle, $fileName ) || die &quot;Cannot open $fileName.\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while( $aLine = &lt;FILEHANDLE&gt; ) # 한번에 한줄씩 읽습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $aLine;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; close( fileHandle );&amp;nbsp; # 다 읽었으니 꼭 닫습니다. !!!!!&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 예제를 만들면서 가능한 실수가 없도록 test를 해 봅니다. 혹시 깜박 잊고 test&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 를 하지 못한데서&amp;nbsp; 실수가 나올 수도 있겠지요. 그&amp;nbsp; 실수를 찾아내는 것은 바로 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ??&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 예 ! 여러분의 숙제입니다. 정 모르시면 메일 주세요. 같이 찾아보도록 하지요. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 그렇다고 욕은 하기 없깁니다.&lt;BR&gt;&lt;BR&gt;15. 조건 - if와 unless&lt;BR&gt;=======================&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위의 예제 mytype2.pl을 보면 아래와 같은 조건부 실행 명령이 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( $#ARGV &lt; 0 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { die &quot;Supply a file name, please.\n&quot;; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 그 의미는 만약 if다음의 ( )안에 있는 내용이 참이면, 즉 $#ARGV가 0보다 작을 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 경우에는, { }로 쌓여 있는&amp;nbsp; 블록 전체를 실행시키고, 그렇지 않으면(거짓이면) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 실행시키지 않는다는 것입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if의 형식은 다음과 같습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( 식 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do_something;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&amp;nbsp; # '식'이 거짓일 경우 블록을 실행. else는 없을 수도 있음.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do_others;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 또는,&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( 식 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do_something;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elsif( 다른 식 ) # elsif는 몇개가 들어가도 좋음.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 주의: elseif라고 하지 않도록 유의할 것.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do_anything;&amp;nbsp;&amp;nbsp; # '식'이 거짓이고 '다른 식'이 참일 때 실행.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do_others;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if의 반대 개념으로 unless가 있습니다. 즉, 조건식에 거짓으로 판명이 될 경우&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 에만 블록내의 명령(들)을 실행시킵니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @a = 3;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unless ( @a == 5 );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Hey\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위에서 hey는 출력이 될까요 안될까요 ???&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 간단한 명령의 실행으로 이렇게 하는 수도 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Yes\n&quot; if $answer == 3;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Shut up !\n&quot; unless $mouth eq &quot;quiet&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 조건식과 명령문의 순서가 위에 보여드린&amp;nbsp; 것과는 구성이 조금 다르지요 ? 그러&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 나 내용은 다르지 않습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 또, 연산자 이야기에서 설명한 것처럼&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $answer == 3&amp;nbsp; &amp;&amp; print &quot;Yes\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $mouth eq &quot;quiet&quot;&amp;nbsp; || print &quot;Shut up !\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 와 같이 if, unless가 아닌 &amp;&amp;, ||를 사용할 수도 있습니다.&lt;BR&gt;&lt;BR&gt;16. 반복 실행 - for, foreach, while, until&lt;BR&gt;==========================================&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; for&lt;BR&gt;&amp;nbsp;&amp;nbsp; ---&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 홍길동과 108장사들의 아름다운 이야기를 기억하십니까 ? 이런 내용이었지요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ... 전략&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for( $i = 0; $i &lt; 109; $i++ )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;따악 &quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; # 109번을 따악 따악 따악 따악 따악 따악 따악 !!!&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ... 후략&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for제어문은 뒤따라 오는 {}블록내의&amp;nbsp; 명령들을 일정한 횟수만큼 반복하여 실행&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 시켜주는 제어문입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for 다음의 괄호 안의 내용은 ; 기호에 의하여 3부분으로 나뉘어져 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for( 초기화; 조건; 조건 비교 후 취하는 행동 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 매번 해야할 일;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 홍길동의 예제를 보면,&amp;nbsp; $i라는 일반 변수를 0으로 초기화한&amp;nbsp; 다음에 $i의 값이 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 109보다 작은지를 검사하고 만일 작으면 블록 안의 내용을 실행한 후 $i의 값을 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1만큼 증가시킵니다. 그리고 다시 $i의 값을 조사, 실행, 증가를 $i의 값이 109&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 보다 같거나 클 때까지 반복합니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 홍길동의 예제를 보시고 또 다른 예제들을 만들어 보십시오.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 숙제를 내 드릴까요 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 참새 10마리가 전깃줄 위에서 노래합니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 첫째 참새는 &quot;짹&quot;, 둘째는 &quot;째잭&quot;, 셋째는 또 &quot;짹&quot;....열째는 &quot;째잭&quot;.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for loop와 % 연산자 그리고&amp;nbsp; if를 이용하여 노래를 시켜보세요. 한글을 띄우기 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 귀찮으면 zag, zazag 해도 되겠지요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 홍길동의 이야기를 이렇게 쓸 수도 있습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ( 1..109 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { print &quot;딱 &quot;; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 간단하죠. 이 형태는 어떤 목록(&amp;nbsp; 1..109는 1에서 109까지의 목록입니다.)의 각 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 요소마다 한번씩 일정 명령문을 반복하는 제어방법을 보여줍니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이런 것도 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ( 1..10, &quot; hello &quot;, &quot;world &quot;, &quot;again\n&quot; )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { print; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 결과는 &quot;12345678910 hello world again&quot;으로 출력됩니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이건 좀&amp;nbsp; 이상하죠 ? 이것만 알아두세요.&amp;nbsp; 일반변수(scalar)가 있어야할 자리에 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 아무것도 보이지 않으면 대개는 그 자리에 &quot;$_&quot;라는 변수가 있는 것으로 가정이 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 됩니다. for( 1..109 )에서는 $_가 1로 초기화되어 109까지 계속하여 2, 3, 4로 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 한번씩 할당됩니다.&amp;nbsp; 그렇게 한번씩 할당될 때마다&amp;nbsp; print &quot;딱&quot;이 실행되는것이&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 고, for ( 1..10, &quot; hello &quot;, &quot;world &quot;, &quot;again\n&quot; )에서는 1에서 10까지 (점이 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 두 개 보이시죠 ? 1..10 ) 그 다음에는 &quot; hello &quot;, &quot;world &quot;, &quot;again\n&quot;이 한번&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 씩 $_에 할당됩니다. 실행되는 부분에서는&amp;nbsp; 또 print에 넘겨지는 인자가 없으므&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 로 $_가 있는&amp;nbsp; 것으로 가정하는 것이지요. print;를&amp;nbsp; print($_);로 바꾸어 써도 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 결과는 같이 나옵니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 할 수 있는&amp;nbsp; 한, 직접 실행을 시켜 보세요. 혹시&amp;nbsp; 제가 거짓말을 하고 있는지도 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 모르지 않습니까 ?&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; foreach&lt;BR&gt;&amp;nbsp;&amp;nbsp; -------&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 배열의 마지막 참조번호는 $#array_name으로 알 수 있다고 했습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ( $elem = 0; $elem &lt;= $#myArray; $elem++ )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $myArray[$elem];&amp;nbsp;&amp;nbsp; # 각 요소는 일반변수이므로&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # @가 아닌 $를 붙인다 했습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위의 예제는 배열 @myArray의 각 요소를 출력하는 문장입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach는 이러한 상황에서 세상살이를 좀 더 넉넉하게 해 줍니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach $elem ( @myArray )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $myArray[$elem];&amp;nbsp;&amp;nbsp; # 각 요소는 일반변수이므로&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # @가 아닌 $를 붙인다 했습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach는 목록으로 생각되는 것들에 적용할&amp;nbsp; 수 있습니다. 배열, hash, 텍스트 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 파일 등등..&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hash (associative array)의 예를 들어 보도록 하지요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # hash.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %myhash = (&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;apple&quot;, 3,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;pear&quot;, 10,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;banana&quot;, 4,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;monkey&quot;, 2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $total = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach $eachKey ( keys %myhash ) # key라는 함수는 hash의 '키'들&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 만을 모아 배열로 묶어줍니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;$eachKey\t&quot;, $myhash{$eachKey}, &quot;\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $total += $myhash{$eachKey};&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;\nTotal\t$total\n&quot;;&amp;nbsp;&amp;nbsp; # \t는 탭입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 출력이 어떻게&amp;nbsp; 되는지 직접&amp;nbsp; 해 보시기&amp;nbsp; 바랍니다. 백견이&amp;nbsp; 불여 일행이라니까&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 요...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위의 foreach $eachKey ( keys&amp;nbsp; %myhash )가 헷갈리는 분들을 위하여 간단히 말&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 씀드립니다.&amp;nbsp; key라는 함수는&amp;nbsp; hash의 '키'들(&amp;nbsp; 위 예문의&amp;nbsp; 경우&amp;nbsp; apple, pear, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; banana, monkey가 key입니다.)만을 모아 배열로 묶어줍니다. $myhash{$eachKey}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 는 각 키에 대한&amp;nbsp; 값( 위 예문의 경우 각각 3, 10, 4,&amp;nbsp; 2 )을 리턴합니다. 쉽게 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 풀어 놓으면,&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @arrayOfKey = keys %myhash;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach $eachKey ( @arrayOfKey )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 와 같습니다. 배열에서 사용하는 foreach와 똑같은 내용이지요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach는 심지어 파일내의 각 줄에 대해서도 적용이 됩니다 !&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # mytype3.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( $#ARGV &lt; 0 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { die &quot;Supply a file name, please.\n&quot;; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( $#ARGV &gt; 0 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { die &quot;Too many parameter.\n&quot;; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $fileName = shift( @ARGV );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( -d $fileName )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { die &quot;$fileName is a directory.\n&quot;; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -e $fileName || die &quot;$fileName is not exist.\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -T $fileName || die &quot;$fileName is not a text file.\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; open( fileHandle, $fileName ) || die &quot;Cannot open $fileName.\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach $aLine (&lt;FILEHANDLE&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $aLine;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; close( fileHandle );&amp;nbsp; # 꼭, 꼭, 꼭, 꼭 닫읍시다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 참 편리한 물건이지요 ?&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 또 for ( 1..10, &quot; hello&amp;nbsp; &quot;, &quot;world &quot;, &quot;again\n&quot; )의 for를 foreach로 바꾸어&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 도 같은 결과를 낳습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; while&lt;BR&gt;&amp;nbsp;&amp;nbsp; -----&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 어떤 조건식이 참인 동안 뒤따라 오는 블록내의 명령들이 계속해서 실행됩니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $i = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ( $i &lt; 109 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;딱 &quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $i++;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 어디선가 본 듯하지요 ? $i가 109보다&amp;nbsp; 작은 동안만 print &quot;딱 &quot;;과 $i++;가 계&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 속 실행됩니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; until&lt;BR&gt;&amp;nbsp;&amp;nbsp; -----&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; until은 while의 반대 개념입니다. 즉 조건이 거짓인 동안만 실행이 됩니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $i = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; until ( $i &gt;= 109 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;딱 &quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $i++;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위의 while과 until의 형식에서는 조건식이&amp;nbsp; 먼저 테스트 됩니다. 따라서 맨 처&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 음부터 조건식이 거짓이거나(while) 참인(until)&amp;nbsp; 경우에 블록은 전혀 실행되지 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 않습니다. 그런 형태의&amp;nbsp; 실행이 필요하면 그렇게 쓰시면&amp;nbsp; 됩니다. 그러나, 일단 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 한 번 실행이 되고난 후에 테스트 되어야 할 경우에는 아래처럼 do와 함께 사용&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 합니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ******( 신소리 )******&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 자꾸 loop에 관한 이야기만 하니까 머리가 뱅뱅(loop) 돕니까 ? 조금만 더 읽어 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 보세요. 참는자에게 복이 있답니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; **********************&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; do 그리고 while/until&lt;BR&gt;&amp;nbsp;&amp;nbsp; ---------------------&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while, until과 큰 차이는 없습니다.&amp;nbsp; 암호를 점검하는 간단한 프로그램을 봅시&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # pwd.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Enter password : &quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $password = &lt;STDIN&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 조금 색다른 것들이 나오네요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; chop( $password );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } while( $password ne &quot;hack&quot; ); # ne는 문자열을 비교하는 not equal&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 연산자라고 했습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Well done !\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 블록내의 명령들은 눈치 보지않고 일단&amp;nbsp; 실행이 됩니다. 그 다음에 조건식이 참&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 인지 시험되고 참이면 불록의 명령들이&amp;nbsp; 반복이 되고 거짓이면 블록의 다음으로 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 넘어갑니다. While과 다른점은 블록의 명령들이 일단 한번은 실행이 된 후에 조&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 건식이 시험된다는 점입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # pwd2.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Enter password : &quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $password = &lt;STDIN&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 자꾸 신경쓰지 마세요. 말씀드릴테니.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; chop( $password );&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 이것도 ...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } until( $password eq &quot;hack&quot; );&amp;nbsp; # until과 eq이 쓰였지요 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # eq는 equal이란걸 다 아시는군요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Well done !\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pwd.pl과 pwd2.pl이 다른것은 while과 until, ne와 eq 뿐입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 파일 읽기 할 때 $aLine&amp;nbsp; = &lt;FILEHANDLE&gt;를 기억하시죠 ? 유닉스에서는 모든 깡&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 통(키보드, 디스플레이, 프린터 등등)들을 파일로&amp;nbsp; 생각한다는 것은 이미 잘 아&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 실겁니다. PERL또한 그 동네에서 출생된지라&amp;nbsp; 글자를 키보드로 입력 받을 때 키&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 보드에 STDIN이라는 파일 핸들을 할당시켜서&amp;nbsp; 그 핸들을 통해 입력을 받습니다. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 그래서 $passwork = &lt;STDIN&gt;;하면 화면에 커서가 깜박이면서 입력을 기다렸다가 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 마지막에 리턴키를 받으면 $password에 입력받은 문자열과 리턴(\n)문자를 저장&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 시킵니다. 그런데 맨 끝에 보면 $password를 &quot;hack&quot;과 비교를 하는 부분이 있는&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 데, 문자열 &quot;hack&quot;에는 &quot;\n&quot;이 포함되어&amp;nbsp; 있지 않지요. 그 &quot;hack&quot;과 비교시키기 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위해 $password에 저장된 문자열의&amp;nbsp; 맨끝에 틀림없이 저장되어 있을 &quot;\n&quot;문자를 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 없애기 위해 chop이라는 함수를 사용합니다.&amp;nbsp; chop은 문자열의 맨 뒤에 있는 한&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 문자를 잘라주는 함수입니다. 라면 끓일 때 파를 뚜껑이 열린 냄비위에 대고 칼&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 로 chop, chop, chop쳐서 썰어 넣는것을 &quot;chop up&quot;이라 한다는군요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; loop의 한 가운데에서 . . .&lt;BR&gt;&amp;nbsp;&amp;nbsp; --------------------------&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loop이 반복실행되고 있는&amp;nbsp; 중간에 조금 빗나가고 싶은&amp;nbsp; 때가 있습니다. 간단히 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 소개하도록 하지요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;&lt; next &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C언어의 continue와 같습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # next.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ( 1..9 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;fore $_\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; next unless $_ % 3;&amp;nbsp; # 3의 배수에서만 맨처음으로 돌아가서 계속.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;aft&amp;nbsp; $_\n&quot;;&amp;nbsp;&amp;nbsp; # $_이 3의 배수이면 이 행은 실행되지 않음.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;End.\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while같은 것으로도 실험해 보세요. (숙제)&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;&lt; last &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C언어의 break와 같습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # last.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ( 1..9 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;fore $_\n&quot;;&amp;nbsp;&amp;nbsp; # $_는 위에서 설명 드렸습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; last unless $_ % 3;&amp;nbsp; # 3의 배수에서 블록 다음으로 넘어감.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;aft&amp;nbsp; $_\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;End.\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 아래는 위 예제의 c 버젼이겠지요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # break.c&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ( int i = 1; i &lt;= 9; i++ )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &quot;fore %d\r\n&quot;, i );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( ! ( i % 3 ) ) break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &quot;aft&amp;nbsp; %d\r\n&quot;, i );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &quot;End.\r\n&quot; );&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위의 예제에서 4에서 9까지는 아예 얼굴도 못 내밉니다. 실험해보세요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;&lt; redo &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; redo는 next와 비슷하지만 전체 블록의 재실행전의 인수의 증가 등을 다시 하지&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 않습니다. 말이 좀 꼬이네요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 즉 for ( $i = 0; $i &lt; 10; $i++ )에서 $i++를 하지 않는다는 뜻입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 예제를 보시고 직접 실행해 보십시오.&amp;nbsp; 예제를 잘 분석해 보시면 제가 무슨말을 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 하려는지 잘 아실것입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다음은 암호를 받는데 있어서 10번의 기회를 주되, 마지막 한자를 잘못 쳐 넣었&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 을 경우에는 우연한 실수임을 가정하여&amp;nbsp; 10번의 count에서는 제외된 3번의 추가 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 기회를 주는 프로그램입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # pwd2.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $count = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ( 1..10 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Type password ($_): &quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; chop( $password = &lt;STDIN&gt; );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( $password eq &quot;hack&quot; )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Right !\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; last;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; chop($password);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( $password eq &quot;hac&quot; )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; last if( $count++ &gt;= 3 );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Almost correct. try more\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; redo;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;End.\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위의 예제를 실행시키면서 암호를 묻는&amp;nbsp; 프롬프트에 a, err, shit등 쓰잘데없는 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 암호를 몇번 입력하다가 haco, hact,&amp;nbsp; hacc등 hack과 끝 글자 한자만 다른 암호&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 를 2번쯤 입력해 보십시오. 그러면&amp;nbsp; redo가 있는 블록이 실행되면서 for(1..10)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 에서 $_가 더 이상 커지지 않는것을 알 수 잇습니다. 이해가 가시죠 ?&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;17. 문자열의 일치&lt;BR&gt;=================&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 문자열의 일치에 대한 연산식은 어떤 문자열에 다른 단어나 구문, 문장 등이 들&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 어있는지 알기위해 사용합니다. 그러려면 =~ 연산자를 사용해야 합니다. 그리고 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 찾을 단어나 구문, 문장주위에는 따옴표 대신 /로 둘러쌉니다. 따옴표도 안되는&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 건&amp;nbsp; 아니지만&amp;nbsp;&amp;nbsp; 일단은&amp;nbsp; 사선(/)으로&amp;nbsp; 하는것을&amp;nbsp;&amp;nbsp; 습관들여&amp;nbsp; 주십시오.&amp;nbsp; 나중에 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; perlop.txt를 보시면 어떤 부호를 어떻게 사용할 수 있는지 알 수 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # contain.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $long = &quot;Tell me what\'s up.&quot;;&amp;nbsp; # '는 특수한 문자이므로 \를 사용&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 하여 excape시킵니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( $long =~ /hat/ )&amp;nbsp;&amp;nbsp; # 보셨죠 ? 문자열 $long에 hat이라는 문자열&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 이 들어있는지 시험합니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Yes, it contains \&quot;hat\&quot;.\n&quot;; # &quot;도 escape시켜야 됩니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;No, it does not.\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hat는 what에 포함되어 있지요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 일치에 대해 이야기하려면 반드시&amp;nbsp; 규정어법(Regular Expression, 약자로 RE)에 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 대하여 짚고 넘어가야만 합니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ******( 규정어법 ? )******&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 사실 저는 유닉스 쪽에서 Regular Expression을 무어라고 번역하는지 잘 모르겠&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 습니다. 어떤 유닉스 입문서에서는&amp;nbsp; 그냥 &quot;레귤라 익스프레션&quot;이라고 했더군요. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 제 생각으로 규정어법이라 하면 맞을 듯 싶어 그렇게 하였습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 혹시 다른 생각이나&amp;nbsp; 올바른 이름을 알고 계시는 분이&amp;nbsp; 계시면 정정하여 주시면 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 고맙겠습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; **************************&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 어떤 문자열 속에 특별한 내용의&amp;nbsp; 단어 또는 짧은 구문이 있는지 검사하는 기능&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 은 웬만한 편집기면 다 가지고 있지요. 그러나 이러한 찾기 기능은 대개 한계가 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 있어서 어떠한 '패턴'의 구문을 찾는데는 조금 문제가 있지요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 예를 들어 &quot;hello world&quot;와 &quot;hello my world&quot;를 같은 패턴으로 생각하고 찾아야 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 한다면 찾기에 애로를 느끼지 않겠습니까 ?.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이러한 패턴을&amp;nbsp; 한 문자열&amp;nbsp; 안에 설정시켜 주는&amp;nbsp; 것이 바로&amp;nbsp; 규정어법, Regular &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression, RE 입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 한가지씩 봅시다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .&amp;nbsp;&amp;nbsp; 점이 보이세요 ? 이것은&amp;nbsp; 딱 한 자(영문 한 자)입니다. 어떤 글자도 좋습니&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다.&amp;nbsp; 단 개행문자인&amp;nbsp; &quot;\n&quot;만은 제외입니다.&amp;nbsp; 그래서 위의&amp;nbsp; 예제 contain.pl에서 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /hat/대신에 /h.t/를&amp;nbsp; 해도 같은 결과가&amp;nbsp; 출력됩니다. /h.t/은 hat,&amp;nbsp; hot, hut, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hit, 등등에 다 해당되지만 heat,&amp;nbsp; heart, hoot, ht 등은 아닙니다. 기억하십시&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 오. &quot;개행문자를 제외한 임의의 한&amp;nbsp; 글자.&quot; 밑줄 치세요. 그리고 간단한 예제로 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 실험해 보세요. 혹시 제가 잘못했으면&amp;nbsp; 제게 삿대질이라도 해야 할 것 아닙니까 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ?&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp; 별, asterisk 입니다. 도스에서 많이 보신&amp;nbsp; 와일드 카드로 쓰이는 문자죠. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 점(.)은 한 글자를 대신할 수 있지만 별(*)은 0 또는 그 이상의 어떤 수의 문자&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 로도 대치될 수 있습니다. 또 다른 점은 점(.)은 그 자체로 어떤 문자를 대신하&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 지만 별(*)은 그 앞에 어떤 문자가 있어야 합니다. 즉 o*p 하면 0 또는 몇 개의 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; o와 p가 있는 것을 말하며 p,&amp;nbsp; op, oop, oooooooop 등이 모두 해당됩니다. 그러&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 나 *&amp;nbsp; 앞에 o와&amp;nbsp; 같은 어떤 문자가&amp;nbsp; 있어야 하고&amp;nbsp; 만일 $str =~&amp;nbsp; /*p/라고 하면 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; perl.exe는 에러 메시지를 내고 실행을 시키지 않습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # contain2.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $long = &quot;I wrote it at the beginning.&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print $long, &quot;\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( $long =~ /h*at/ )&amp;nbsp;&amp;nbsp; # /*at/, /a.t/도 실험해 보세요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp; print &quot;Yes, it contains.\n&quot;;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp; print &quot;No, it does not.\n&quot;;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 결과가 어떻게 나올까요 ?&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; +&amp;nbsp;&amp;nbsp; 보태기 표입니다. *가 0 또는&amp;nbsp; 몇 개인 데에 반해 +는 '1' 또는 몇 개 입니&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다. 그래서 o+p는 op, oop, ooooop와 일치되지만 p에는 일치되지 않습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ?&amp;nbsp;&amp;nbsp; 물음표입니다. 0 또는 1개의 문자에 일치됩니다. 즉 o?p는 p 아니면 op입니&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; +나 ? 모두&amp;nbsp; 그 앞에 어떤 문자가 있어야 하는&amp;nbsp; 것은 *과 동일합니다. 주의하세&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 익숙해지는 방법은 자꾸 해보는 수밖에 없습니다. 자꾸 만들어 보세요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 문자열의 어디에나 있는 구문이 아니라 문자열의 처음이나 맨 끝에 있는 것만을 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 찾으려 할 때에는 어떻게 할까요 ?&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ^는 문자열의 맨 처음을, $는&amp;nbsp; 맨 끝을 나타냅니다. $는 일반변수의 $와 혼동될 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 염려가 없으니 신경 쓰지 마십시오.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 생각할 수 있는 것들을 적어보도록 하지요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the, tie, toe, 등등. settle에도 포함되어 있죠.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ^t.e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위와 같으나 문자열/줄의 처음에 있을 경우.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; settle은 안됨.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ^.e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; he, me, regard 등이 문자열/줄의 처음에 있을 경우.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.e$&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; toe, necktie 등으로 끝나는 문자열.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s*he&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; she, he, ssssssssshe, the, tshe&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s+he&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; she, sshe, sssssshe, tshe 등. he, the는 안 됨.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s?he&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; he 또는 she.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ^s?he$&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;he&quot; 또는 &quot;she&quot;. 한 줄에 이 두가지만이 허용됩니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 개행문자를 제외한 모든 글자들.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ^$&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 빈 줄/문자열.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 또 드리는 잔소리: 백견이 불여 일행.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 조금 더 심오한 선택을 해 볼까요 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; []로 쌓여있는 글자들은&amp;nbsp; 몇 자가 되든 단 한&amp;nbsp; 글자만을 대변하며, 포함된 모든 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 글자 중&amp;nbsp; 어떤 글자라도 있으면&amp;nbsp; 일치되는 것으로 인정됩니다.&amp;nbsp; []를 character &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class라고 하더군요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [st]he&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; she 또는 the.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ^[st]he&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 문자열의 처음에 있는 she 또는 the.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [a-z]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 소문자 한 자. '-'는 between의 의미로 범위를 나타냄.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [a-zA-Z]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 소문자 또는 대문자 한 자.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [0-9]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 십진수 한 자.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [-0-9]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '-'부호와 십진수 중 한 자. 빼기 부호를 사용하려면&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 맨 앞에 두어야만 합니다. 안 그러면 범위를 나타내는&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '-'부호와 헷갈리겠죠 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [0-9a-fA-F]&amp;nbsp;&amp;nbsp; 십육진수 한 자.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; h[eao]y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hey, hay, hoy.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ^h[eao]y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 문자열의 첫머리에 있는 hey, hay, hoy.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; h[^eao]y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hey, hay, hoy를 &quot;제외한&quot; /h.y/. 즉 hiy, hfy, huy 등.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 문자클래스(character class)안에서의 ^ 부호는 not 또는&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; except를 의미합니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [^a-z]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 소문자 빼고 모두 다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [a-z]+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 소문자가 한 자 또는 줄줄이 있는 것들.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; w, kdfns, oie, jfowjdngjwerh 등등.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [tT][hH][eE]&amp;nbsp; the, thE, tHe, tHE, The, ThE, THe, THE, 등.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 마지막 예는&amp;nbsp; 대소문자 구분없는 the를 찾기위한&amp;nbsp; 방법의 하나였습니다. 그런데 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 조금 더 편리한 방법이 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $long = &quot;The world of mine !&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( $long =~ /World/i ) { print &quot;Yes\n&quot;; } # 이상한게 있지요 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else { print &quot;No.\n&quot;; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이 예에서는 yes가 출력됩니다. /World/뒤에 i 자 하나가 매미처럼 붙어 있죠 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;ignore case&quot;의 첫 글자로 대소문자&amp;nbsp; 구분을 하지 말란 뜻입니다. HTML의 태그&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 들은 대소문자를 구분하지 않습니다. 그런 경우 
&lt;TABLE&gt;과 
&lt;TBODY&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;TABLE&gt;을 동시에 찾&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 으려면 아주 유용한 선택이 되겠지요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 앞에서 $_라는 특수 변수에 대하여 이야기 한 적이 있습니다. 찾아보세요. 거짓&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 말 아닙니다. 다시 한 번 말씀드리면 어떤 변수가 사용되어져야 할 장소에 아무 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 변수도 보이지 않으면 PERL은 $_가&amp;nbsp; 있는것으로 생각합니다 그래서 위의 간단한 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 예제는 이렇게 고쳐도 같은 결과를 보여줍니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $_ = &quot;The world of mine !&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( /World/i ) { print &quot;Yes\n&quot;; } # $_ =~ ... 로 생각합니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else { print &quot;No.\n&quot;; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 또 다른 재미있는 특수 변수를 두개 더 소개하지요. 정신 사나우시면 그냥 그런&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 게 있구나 하고만 넘어가세요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위의 예제를 이렇게 고쳐봅시다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $_ = &quot;The world of mine !&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( /World/i ) { print &quot;Yes\n&quot;; } # $_ =~ ... 로 생각합니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else { print &quot;No.\n&quot;; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Fore : $`\nAft&amp;nbsp; : $'\n&quot;;&amp;nbsp; # $`, $' ??&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위의 예제를 직접 실행해 보시기 바랍니다 출력되는 결과는&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Yes&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Fore : The&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # The 뒤에 공백이 하나 있습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Aft&amp;nbsp; :&amp;nbsp; is mine !&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 어떤 문자열의 일치를 실험해 본&amp;nbsp; 후 결과가 성공적이면 $`에는 찾은 문구의 바&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 로 앞부분이, $'는 뒷부분이 할당되어 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; My name is Jongpil&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; My name is Inhyon&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; My name is Jungkwang&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; My name is Kwanghoon&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; My name is Hyongku&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 자, 위의 각 줄에서 이름만 따로 저장할 수 있겠습니까 ? $'를 사용하면 되겠지&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 요 ?&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 문자열의 일치에 대해서는 이 정도만&amp;nbsp; 아셔도 웬만한 일은 하실 수 있으실 겁니&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다.&amp;nbsp; 다음은 그저&amp;nbsp; 참고&amp;nbsp; 삼아서&amp;nbsp; 보시고 더&amp;nbsp; 알고&amp;nbsp; 싶으신&amp;nbsp; 분은 영문&amp;nbsp; 참고서&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (perlre.txt)를 한번 보세요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --- 수직 막대, | 는 or 부호이고, ()는 글자들의 그룹입니다.&amp;nbsp; ---&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /clean|dirty/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clean 또는 dirty&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (eg|le)gs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eggs 또는 legs&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ba(na)+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bana, banana, bananananana&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *** ()를 사용하는 그룹화된 패턴은&amp;nbsp; 한글에 적용할 때 유용하리라 생각됩&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 니다. 다음 예문을 보시지요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $long = &quot;닐리리 닐리리 닐리리야&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( $long = /닐(리)+/ )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { print &quot;닐리리야 니나노.\n&quot;; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { print &quot;어쩔시구리.\n&quot;; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --- 특수문자들도 유용합니다. ---&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \n&amp;nbsp;&amp;nbsp;&amp;nbsp; 개행문자.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \t&amp;nbsp;&amp;nbsp;&amp;nbsp; 탭.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \w&amp;nbsp;&amp;nbsp;&amp;nbsp; 문자 또는 숫자. [a-zA-Z0-9]와 같습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \W&amp;nbsp;&amp;nbsp;&amp;nbsp; \w가 아닌 것. [^a-zA-Z0-9]와 같습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \d&amp;nbsp;&amp;nbsp;&amp;nbsp; 십진수. [0-9]와 같습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \D&amp;nbsp;&amp;nbsp;&amp;nbsp; 십진수 아닌 것. [^0-9]와 같습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \s&amp;nbsp;&amp;nbsp;&amp;nbsp; 공백문자. space, 탭, 개행문자 등.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \S&amp;nbsp;&amp;nbsp;&amp;nbsp; 공백문자 아닌 것.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \b&amp;nbsp;&amp;nbsp;&amp;nbsp; 단어의 경계(boundary). [ ]의 바깥에서만 사용.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;the green grass of home&quot;의 \bthe\b, \bgreen\b,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \bgrass\b, \bof\b, \bhome\b.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \bthe\b와 \bhome\b도 포함됨에 유의하세요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \B&amp;nbsp;&amp;nbsp;&amp;nbsp; 단어의 경계가 아닌 것.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --- {}는 문자, 그룹의 개수를 지정합니다. ---&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ba(na){2}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; banana만 해당.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ba(na){1,2}&amp;nbsp;&amp;nbsp; bana, banana만 해당.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ba(na){2,5}&amp;nbsp;&amp;nbsp; banana, bananana, banananana, bananananana만 해당.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; o{2,4}p&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oop, ooop, oooop.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 중요: 위에서 쓰였던 특수한 문자들 ^$|[]()\/{}*.?+ 등을 그 자체로 사용할 때&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 는 그 앞에 \를 붙여 주세요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \^ \$ \| \[ \] \( \) \\ \/ \{ \} \* \. \? \+&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 정말 중요한 것은 직접 간단한 프로그램을 만들어서 시험해 보는 것입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 몇 장 되지도 않는 설명에&amp;nbsp; 포기해서는 정말 액티브한 홈페이지를 만들 수 없겠&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 지요 ? 글쎄 아이큐 두 자릿수도 이해를 하고 있잖아요...&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;18. 문자열의 치환 - Substitution, Translation&lt;BR&gt;==============================================&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 치환은 일치의 응용으로 생각하시면 됩니다. 연산자도 =~를 사용하고 문자를 둘&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 러싸는 부호도 /입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 치환을 위하여 s///라는 함수를 사용합니다. 문장의 구조는&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;뒤적거릴 문자열&quot; =~ s/찾을 문자열/바꿀 문자열/옵션;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 문자열을 찾아서 치환이 되었을 때 치환시킨 문자열의 수를 리턴합니다. 치환이 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 하나도 되지 않았다면 0을 리턴하겠죠.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # subst.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $_ = &quot;Where is my baby, Oh Baby !&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( $count = ( s/baby/lover/ ) )&amp;nbsp; # $_ =~ s/.... 로 인정됩니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp; print &quot;Replaced $count time(s).\n&amp;nbsp;&amp;nbsp; \&quot;$_\&quot;\n&quot;;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&amp;nbsp; {&amp;nbsp; print &quot;Failed.\n&quot;;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Fore : $`\nAft&amp;nbsp; : $'\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위 예제의 결과를 예상해 보시고&amp;nbsp; 직접 실험해 보시기 바랍니다. $count의 값만 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 참고로 말씀드리면 1입니다. 뒤에는 대문자로 시작하는 Baby라서 그런가 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 아, 벌써 아셨군요. 제가 s/baby/lover/i라고 말하려 한다는 것을 !!!&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 한번 해 볼까요 ?&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 틱, 티딕, 틱틱틱 퍽 !&amp;nbsp; (퍽은 enter키 치는 소리.)&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 아니 ??! 결과가 이상하다 !! 왜&amp;nbsp; 뒤의 Baby는 그냥 있지 ? 전종필이 가만 놔두&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 지 않겠다 eC....&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &gt;-(&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 잠깐요 ! ... 아 ! 한 가지 더 있었군요. g, global substitution, 전역 치환이&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 라는 옵션을 사용하지 않으면 맨&amp;nbsp; 처음에 발견되는 문구만 치환이 되고 그 뒤는 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 더 이상 뒤적거리지 않는것입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 해 보시죠 ..s/baby/lover/gi.. 퍽 ! ...&amp;nbsp; 음, 역시 그렇지요 ?&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 그리고 마지막 줄의&amp;nbsp;&amp;nbsp; print &quot;Fore : $`\nAft&amp;nbsp; :&amp;nbsp; $'\n&quot;;의 결과도 눈여겨 보세&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 문자열의 일치에서 살펴보았던&amp;nbsp; 모든 규정어법(Regular Expression)이 여기서도 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 적용이 됩니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 간단한 예제 하나만 해 보고 부연하지 않겠습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # banana.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $_ = &lt;&lt;ENDOFSTR; name you many but want a 조금 우리 알아 다음에 따라오는 예제를 손에 하는 변수가 있습니다. 여 에서 변수에 결과가 그러나 문자열을 경우에는 그대로 보시고 결과를 보세요. 배열을 것 아시죠 3, 5, hash ! 직접 ******( 특수한 )****** 예를 ??, 문자열 방법을 않고 하면 문자열은 그래서 ?The 와 됩니다. 경우도 또 같이 문자의 다른 방법이 있 습니다. 단 보십시오. 다음 맨 is 하나 드릴께요. # $a=&quot;$x;&quot; ; ) ( { $_=&quot;* is not \$&quot; $a, ); } ?\n?; print 라는 어떻게 수 ? 대하여 같습니다. 하지요. 어떤 이 서 후 그 출력을 물론 여러분의 2 있는 의 것입니다. 바꾸어 다. open( Banana What banananana Not banananananana, Give me banana. How bananas do A BaNaNa. ENDofSTR ba(na)+ pear gi ?Replaced time(s).\n$_\n?; ?Failed.\n?; ?Fore $`\nMid $&amp;\nAft : $?\n?; 새로운게 나왔죠 $&amp; 특수문자 더 알려 $`에 앞, $?에는 뒤가 할당될 $&amp;에는 마 지막으로 찾은 자체가 다 아셨겠지 만요. 문자단위(character, byte)의 치환(Translation)에 말씀드릴 때인 같군요. 이지만 치환은 $string=&quot;~&quot; abc ABC 명령은 $string변수내의 ?모든? a를 A로, b를 B로, c를 C로 주고 치환된 문자수를 한글은 바꾸어지지 않는것 한글 은 글자가 바이트니까요. 한가지는 치환에서는 일치나, 치환에서와 는 달리 규정어법(Regular Expression, RE)이 통하지 않는다는 사실입니다. re_tr.pl if( ?Translated $count=&quot;(&quot; char(s).\n$_\n?; else ?No translation.\n?; * 부호는 자체로 해석되는것을 그러나, 중요한 예외가 일치와 치환에서 쓰였던 ?-?부호 (between)은 쓰입니다. 모든 소문자를 대문자로 바꿀 tr a-z A-Z 19. 나누기 split Perl 프로그램에서 치환만큼 유용한 도구가 split함수 입니 아주 함수=&quot;=============================&quot; 호출 번으로 대개는 데이타의 형태 을 손쉽게 줍니다. split.pl +는 특수효과가 \ escape합니다. ?$theData\n@dataArray\n?; 따옴표 ??에 넣고 한자씩 들어간다 했지요 split( )는 $theData에 ?+?를 기준으로 나누어 저장하라는 예제에서 그러면 올까요 겹쳐진 +들 \+ 형 태를 갖게 올바른것으로 받아들일 분리자가 겹쳐도 하나로 싶은 때에는 진전된 기능을 이용합니다. 새 로운것은 아닙니다. @dataArray=&quot;split(&quot; \++ $theData=&quot;Jongpil+male+32+Seoul, Korea&quot; 문자열의 일치에서 *, +의 기능에 이야기 했었지요 \++는 +기호(앞의것)를 분리하되 ?하나 또는 이상? 갯수이더라도 하나인 것과 동일하게 인식한다(뒤의 +부호)는 따 라서 분리할 문장내에 몇개 겹쳐있어도 공백문자열이 할당되는 일이 없이 @dataArray는 ?male?, ?32?, Korea? 형태를 갖 게 부호의 \부호가 붙은것은 +가 뒤의 부호처럼 의미를 지닌 문자이기에, 특수 부호로서가 그자체로서 인식되게 하기위 확실하게 있을겁니다. arrsplit.pl @theData=&quot;(&quot; ?Jongpil 75?, ?Inhyon math 90?, ?Jungkwang english 100? print; $_; foreach, 기억하시죠 @tempArr; foreach (@theData) @tempArr=&quot;split(&quot; %3s\n?, 위에 함수가 나와 있군요. C++ 프로그래머들에게는 익숙한 것이지만요. printf함수는 형식문자열 (위의 ?%-10s %-7s %3s\n? 요구에 뒤 변수들( $tempArr[0], $tempArr[1], $tempArr[2] )을 일정한 형식대로 출력 위의 %-10s는 문자열(s, string)을 10자의 왼쪽 (-)부터 쓰되 남는 공간 (Jongpil의 3)은 공백으로 채우라는 %-7s는 7자 넓이인것은 미루어 짐작하시겠고, %3s는 ?-?표시가 쪽 모르시는 분들을 printf에 대한 간단한 설명입니다. 문장구조: printf FILEHANDLE LIST LIST의 구조: ?형식 문자열?, [일반변수 일반변수 [, ..]]] 형식 지정 문자열: 뒤에 변수(들)를 어떤식으로 것인지를 주는 문자열입니다. 변수를 대치 시킨다는 명령으로 인식되는 변수의 형식에 따라 f, 출력할 문자폭을 지정해 주기위한 변수형식 지정자 앞의 숫자, 필요에 따른 부호, 등으로 구성됩니다. s ?Hello Mr.Kim? d 정수 25 f 실수 형태로 출력하고자 사용됩니다. 25.735 % 부호 뒤, 지정자인 s, d, f의 들어가면 숫자는 문자가 글자의 폭을 차지할지 결정합니다. %10s는 영문자 10 자폭으로 %12d는 지정된 숫자를 정수형태로 10자 폭으로 출력한다는 뜻입니다. 실수의 문자폭과 더불어 소 숫점 이하의 부분을 몇 단위까지 포기할 것인지 지정이 %8.3f는 총 8자의 출력하되 소숫점 이하는 3개폭으로 하여 빈 공간의 경우는 0으 로 채워 출력하라는 즉 0.3의 0.300?으로 문자폭에 맞추어 출력될 때, 문자열, 숫자 등은 해당 폭의 오른 출력됩니다. 원치 출력이 왼 붙어서 되길 바랄때는 %표 시 바로 ?-?부호를 더합니다. 숫자의 앞을 0으로 채우고자 문자폭 정시 앞에 0을 덧붙입니다. 즉, %08.3f, %010d 등과 설명은 어지러운 듯도 알려드리면, 실험해보시라는 해보시고 보시면 모든것이 잡힙니 printf( ?|%-15s|%04d|%10.3f|\n?, ?Thank you?, 50, 524.62 ********************************************************************** 20. 배열(array)=&quot;===============&quot; 배열(Array)은 변수(scalar)들이 순서대로 늘어서 집합체이 며, 숫자와 수용하는 것처럼, 숫자일 도, number? 6, ?But string? ??로 출력하면 각요소 사이에 성립이 된다고 했습니다. 참조 번호(index No.)는 0에서부터 시작 하고, 참조변수는 $#arrayName으로 있다고 했고요. 자체로서 독립적인 합니다. 일부는 @array[시작참조번호..끝참조번호]로 나타냅니다. arrpart.pl 8, ?String? 배열에 복사합니다. $n=&quot;4;&quot; ?@arr[1..$n]\n?; ?@arr2\n?; ?$arr2[1]\n?; @arr[1..3]은 참조번호 1에서 3번 까지의 요소들의 의미입니다. 복사하기 Perl에서는 복잡한 단계 를 거치지 위에서처럼=&quot;(할당&quot; 연산자)를 할당하기만 초기화 되어 값들이 복사됩니다. 이런 일을 하면서도 C++처럼 메모리에 크게 걱정하지 않아도 되니 정말 뱃속이 편하군요. 결과적으로 7, ?Not number?, 8 원래의 @arr에는 변화가 없음을 다음줄에서 위에서는 작아졌지만, 크기가 커질 때는 해야 할 까요 $aaa=&quot;4;&quot; $bbb를 @arr의 뒷 쪽에 붙여 큰 만든다고 결은 간단합니다. 새로운 배열 @arr2는 87, 23 )이 ?Fore?, $bbb, ?aft?, ?fore?, @arr[2..4], ?aft? @arr2=&quot;@arr[1..3];&quot; @arr[0-2], $aaa, $bbb=&quot;23;&quot; 등도 배열로부터 각요소의 끌어내는 방법들에 ?Jongpil?, 32, ?Seoul, Korea?, ?male? 일 경우, $name=&quot;$personal[0];&quot; 매우 고전적인 방법이군요. $age=&quot;$personal[1];&quot; $home=&quot;$personal[2];&quot; 더욱 편리한 $name, $age, $home, $sex=&quot;$personal[3];&quot; C, C++의 구조체(structure)와 비슷한 데가 있지요 $name.\n?; $firstData=&quot;shift(&quot; 첫번째 요소는 $firstData에 $lastData=&quot;pop(&quot; @personal=&quot;(&quot; 마지막 요소가 $lastData에 할당된 사라집니다. pop함수는 다루는 함수입니다. 아래의 한번 보세 요. shiftpop.pl $last=&quot;pop&quot; @arr; $second=&quot;shift&quot; $last\n?; boom.pl while( $elem=&quot;pop(&quot; pop을 shift로 바꾸어서도 해보세요. ?$elem\n?; ?BOOM shift와 pop은 앞과 뒤에서 하나의 끄집어 내는 함수임을 쉽게 뒷부분을 용감하게 잘라내려면 참조번호를 줄이는 만 으로 가능합니다. 방법은 잘려나간 부분의 알 없으므로 사용 에 주의를 요구합니다. 크기를 늘리는데도 통합니다. 지 아무런 값이 없는 요소의 자리만이 마련되지요. $#arrayName 크기는 3자리 만큼 #현재 $#arr는 $#arr=&quot;3;&quot; 아아 스러져 갔습니다. $arr[4], ?\n?만을 출력합니다. 다시, $arr[4]=&quot;9;&quot; 그리고 또, $arr[6]=&quot;100;&quot; 하고 . ?@arr\n?; $arr[5]는 자리만 있고 할당되지 않습니다. 이렇게 크기도 늘어 납니다. Perl의 배열은 고무줄처럼 늘어납니다. 재미있는 예재가 여러분도 번 저하고 나오겠죠 테스트는 도스용 4.x로 본겁니다. cutpaste.pl @a=&quot;(&quot; 1,2,3,4,5,6 + 보이는 5와 $#a - $a[5]=&quot;7;&quot; ?@a\n?; 사라진 5 위에서 pop이란 함수를 보셨습니다. 당연히 push가 있겠지요. 1, 2, 4, 6 $first=&quot;shift&quot; ?last? ?again?, ?more? push( ?Oh,?, ?stop?, ?it !? ?$first @arr\n?; push는 마지막에 push된 값을 리턴합니다. @arr3=&quot;(&quot; ?not?, ?again? )를 @arr에 push할 경우 리턴되는 값은 ?again?이지요. ?@array? )의 효과에 대해서 아실겁니다. 사실 ?@array?는 전체적으로 볼 때 아니라 일반 변수(scalar)입니다. 그저 문자열일 뿐이며 단지 배 열이 실제 내용으로 치환되는 ?작용?이 있을 뿐이지요. 그래서, ?@arr\n?과 라고 해도 하십시오. 에서는 $arr에 $#arr가 할당됩니다. 의심나시면 진짠데... 변수들의 이름 이상해 보입니까 분명히 $와 @의 차이가 $arr와 $arr[1]에는 [] 참조연산자가 차이를 보여주고요. 헷갈리는것은 사람들의 눈이지 Perl번역기는 아닙니 $arr, @arr, %arr모두를 한 프로그램 안에서 있지요. 런 변수 사용하느냐 마느냐는 프로그래머의 선택입니다. 통일성을 같은 수도, 혼동을 피하기 위해 이름을 사용할 수도 눈의 착각을 정리하기 위해서도 만들어서 실행해 보 는것은 필수입니다. ***************************** 몇가지 $y , .... )도 이름만 없을 역시 배열입니다. @forearray=&quot;@aftarray와는&quot; 모양만 다를 뿐 내용은 $b $w, $x, $y, $z )[1..2]; 위와 @dish, $rest @dish 주의 !! $rest는 아무것도 할당 안됨. join이라는 함수에 대해 보겠습니다. $arr=&quot;@arr&quot; 가 요소간에 공백을 넣어서 전체를 연결하는 역할을 해 주 는데 비해 join은 공백이 아닌 문자(들)를 이용하여 배열의 연 결할 ?:?, ?:::?, $str=&quot;join(&quot; ?, @arr=&quot;(&quot; print( ?$str\n? join함수는 데이타를 묶어서 저장하기 전에 후일 검색하 split으로 다시 풀어 헤치기 위한 준비를 하는데도 적합합니다. 다음의 예제는 학생들의 ID, 이름, 학년을 ?studile?이라는 파일에 저장하는 간 단한 예제입니다. hash와 배열이 사용되는지 잘 살펴 savestud.pl $stufile=&quot;stufile&quot; students는 입니다. 따라서 각 요소를 지정하기 위하여 {}를 사용합니다. $students{ 숫자가 들어간다고 해서 배열로 착각해서는 안되어요. 123 246 357 $studyear{ 212 이제 두 개의 %students와 %studyear가 만들어졌습니다. Hstufile,&gt;)로 열었습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ( keys %students )&amp;nbsp; # keys 함수는 hash의 key들만을 모아서&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 배열로 만들어 return한다고 했습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $stud[0] = $_;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # $_ 기억하시죠 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $stud[1] = $students{$_};&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $stud[2] = $studyear{$_};&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $string = join( ':', @stud );&amp;nbsp; # : 부호로 join합니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $string .= &quot;\n&quot;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # ID와 학년, 그리고 사람 이름에&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 들어갈리 없는 부호니까요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print Hstufile $string;&amp;nbsp; # 핸들을 통해서 파일에 프린트합니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; close Hstufile;&amp;nbsp; # 꼭, 닫읍시다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; split 함수를 기억하십니까 ? join함수의 역개념이지요. 지금 그것을 다시 설명&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 하면 제가 여러분을 무시하는것이 되겠지요&amp;nbsp; ? 그러나 join에 짝이 없어서 서운&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 하니까 한마디만 할께요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; split함수는 어떤 패턴을 이용하여 문자열을 배열로 나누어 저장합니다. 궁금하&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 시면 저의 Perl 이야기-3의 맨 뒷부분을 참조하세요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Perl에 관한 문서들을&amp;nbsp; 보면 자주 나오는 이야기가 있습니다.&amp;nbsp; &quot;방법은 한 가지 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 만은 아니다&quot;는 말입니다. 여러가지&amp;nbsp; 방법을 고려해서 문제를 풀어 나가십시오. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 어떤 문제던지...&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ******( 일반변수의 기이한 재주 )******&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 맨 처음에 변수에 관한 이야기를&amp;nbsp; 하면서 빼놓고 간 이야기가 있는것 같습니다. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 일반변수에는 문자와 숫자를 번갈아 할당할&amp;nbsp; 수 있다고 했습니다. 그런데 이 재&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 미있는 재주&amp;nbsp; 말고도 Perl의 변수는 문자열로&amp;nbsp; 저장되어있는 숫자형태의 변수를 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 계산식에까지 적용시킬 수 있다는 것입니다. 그래서,&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a = &quot;5&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $b = 3;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $c = $a + $b;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;$c\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 라고해도 군소리없이 8자가 나온다는 것이죠. 편리한 방법 아닙니까 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ***************************************&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;21. Hash (Associative Array, 잡동사니)&lt;BR&gt;======================================&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Hash는 본래 Associative array라고 하는건데 문자대로 말하면 &quot;연상배열&quot;이 되&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 겠죠. 즉, 참조번호가 아닌 키워드에서 어떤 값을 연상해 내는 방식을 생각하시&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 면 됩니다. 그러나&amp;nbsp; 그것은 사실 연상의 결과는 아니지요.&amp;nbsp; 단지 그렇게 보이는 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 것이지요. 그래서 Hash라고 하는지도&amp;nbsp; 모릅니다. 연상배열이 아니라 잡동사니라&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 는...&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Hash의 각 요소도 배열의 요소처럼 일반변수(scalar)입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # score.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scores{&quot;engl&quot;} = 75;&amp;nbsp;&amp;nbsp; # hash의 각 요소의 값에는 당연히&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scores{&quot;math&quot;} = 80;&amp;nbsp;&amp;nbsp; # $가 붙습니다. 일반변수이니까요.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scores{&quot;geo&quot;}&amp;nbsp; = 65;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ( keys( %scores ) )&amp;nbsp; # 여기서는 hash그 자체를 가리키므로&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # % 부호가 붙습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;$_ : &quot;, $scores{&quot;$_&quot;}, &quot;\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; keys 함수는&amp;nbsp; hash의 key들만을 모아서 배열로&amp;nbsp; 만들어 return한다고 했습니다. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 그러면 값들만을 모아서 배열로 만들어 주는 함수는 없을까요 ? 물론 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # test.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scores{&quot;engl&quot;} = 75;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scores{&quot;math&quot;} = 80;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scores{&quot;geo&quot;}&amp;nbsp; = 65;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @keys = keys %scores;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @values = values %scores;&amp;nbsp;&amp;nbsp; # 바로 여기있군요 !&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while( $#keys &gt;= 0 ) # 으잉 ???&amp;nbsp; pop을 한번씩 할 때마다 마지막&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 요소의 참조번호는 1씩 작아집니다. 당연하죠 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print pop( @keys ), &quot; : &quot;, pop( @values ), &quot;\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 요 위의 pop들을 shift로 바꾸어서 실행해 보세요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 부연하지 않아도 이해가 되시죠 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 아무리해도 이해가 안되시면 메일주세요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ******( 괄호들은 어디에 ? )******&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 똑같은 함수를 사용하면서도 어디에는 괄호를 씌우고 어디에는 시원하게 벗겨놓&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 고 . . . Perl에서는&amp;nbsp; 괄호를 선택적으로 사용합니다. 굳이 없어도 혼동되지 않&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 는다면 함수의 인자들도 괄호로 둘둘 말 이유가 없습니다. 그래서&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print 8 + 3, &quot;\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print( 8 + 3, &quot;\n&quot;);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 는 같은 결과를 출력합니다. 단,&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print ( 8 + 3 ), &quot;\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 은 약간 이상한 모양이 됩니다. 즉, &quot;\n&quot;이 출력되지 않습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Perl은 , 연산자를 보면 ,의 왼쪽을 먼저 계산합니다(evaluating). 그래서&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $a = 5, $a = 4, $a = 3;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 의 경우 $a에는 결국 3이&amp;nbsp; 저장되는 것입니다. 또 함수와 그에 따라오는 ()부호&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (List operator)는 전체로서 하나의 Term을&amp;nbsp; 이루며 Term은 그 어떤 연산자보다 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 큰 우선순위를 갖기 때문에 위의 print함수의 예에서는 print ( 8 + 3 )이 먼저 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 계산되고 그 다음에 &quot;\n&quot;이 계산됩니다.&amp;nbsp; 그 계산의 결과로 나타나는 것은 아무&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 것도&amp;nbsp; 없지만요.&amp;nbsp; (계산된다는&amp;nbsp; 의미를&amp;nbsp; calculation으로만&amp;nbsp; 생각하지&amp;nbsp; 마시고, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; evaluation, manipulation 등으로도 생각하십시오.)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다음 명령문들을 실행해 보시고 출력물의 의미와 왜 그런 결과가 나왔는지를 생&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 각해 보시기 바랍니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Fore\n&quot;, print &quot;Aft\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print ( 5 + 3 ) * 5, &quot;\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 어떤 결과를 쉽게&amp;nbsp; 예측할 수 없으시는 경우에 가장&amp;nbsp; 훌륭한 해결방법은 간단한 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 예제를 만들어 실행해 보는 것입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; **********************************&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Hash를 배열에, 배열을 다시 Hash에&amp;nbsp; 저장할 수 있습니다. 제 순서를 지켜서 찾&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 아들어 가지요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # test.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scores{&quot;engl &quot;} = 75;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scores{&quot;math &quot;} = 80;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scores{&quot;geo&amp;nbsp; &quot;} = 65;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scores{&quot;music&quot;} = 98;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @arr = %scores;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;\@arr : @arr\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $count = ( $#arr + 1 ) / 2;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Number of data in %scores : $count\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %scores2 = @arr;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ( keys %scores2 ) { print &quot;$_ : &quot;, $scores2{&quot;$_&quot;}, &quot;\n&quot;; }&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; keys와&amp;nbsp; values함수외에 each라는&amp;nbsp; 함수가 있습니다.&amp;nbsp; 이 함수는&amp;nbsp; hash의 key와 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value를&amp;nbsp; 짝지어 한&amp;nbsp; 배열 안에&amp;nbsp; 넣어줍니다. each함수가&amp;nbsp; 한번씩 불려질때마다 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hash의 요소가&amp;nbsp; 순서대로 리턴되고, 모든&amp;nbsp; 요소가 다 리턴 되고나면&amp;nbsp; 그 다음은 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL 배열이 되돌려집니다. 그러므로 아래의 while의 조건문은 제대로 작동됩니&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # each.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %scores = ( &quot;engl&quot;, 75, &quot;math&quot;, 80,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;geo&quot;, 65,&amp;nbsp; &quot;music&quot;, 98 );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while( ($key, $value) = each %scores ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;$key :\t$value\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 조금 긴 예제를을 한번 보시고 hash이야기를 마치겠습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 학생 개인의 데이타와 학과 성적이 각각의 파일에 다음과 같이 저장되어 있습니&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다. 자료파일은 그저 평범한 텍스트 파일입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 첫번째 파일은 stufile이고 각 줄은 한 학생의 id, 이름, 학년이 : 로 분리되어 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 123:Jongpil:2&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 246:Inhyon:1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 357:Jungkwang:3&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 212:Kwanghoon:2&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 또 두번째 파일은 scores이고 각 줄은 학생의 id, 학과번호, 시험점수가 공백으&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 로 분리되어 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 123 1 87&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 246 1 76&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 123 3 77&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 212 2 99&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 246 3 58&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 357 2 69&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 123 2 84&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 357 3 97&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 212 1 74&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 246 2 98&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 212 3 88&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이 자료파일들의 내용을 다음과 같이 출력하려 합니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID&amp;nbsp; Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; year&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp; 3&amp;nbsp;&amp;nbsp;&amp;nbsp; Totals&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 123 Jongpil&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp; 87&amp;nbsp; 84&amp;nbsp; 77&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 248&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 212 Kwanghoon&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp; 74&amp;nbsp; 99&amp;nbsp; 88&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 261&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 246 Inhyon&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp; 76&amp;nbsp; 98&amp;nbsp; 58&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 232&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 357 Jungkwang&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp; 69&amp;nbsp; 97&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 166&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 237 350 320&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 907&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 맨 윗줄의 1, 2, 3은 학과 번호입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 조금 복잡해 보일지 몰라도 예제를&amp;nbsp; 자세히 보시면 크게 어려울 것도 없습니다. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다음은 예제입니다.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # test.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $stufile = 'stufile';&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scorefile = 'scores';&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $maxnamelength = 0;&amp;nbsp;&amp;nbsp; # 이 두줄은 꼭 필요한 것은 아니지만&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $maxexamno = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 명확히 해주기 위해 넣었습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; open( Hstufile, &quot;&lt;$stufile&quot; )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || die &quot;Can\'t open $stufile.\n&quot;;&amp;nbsp; # 열어라, 아니면 죽어라.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while( &lt;HSTUFILE&gt; )&amp;nbsp; # $_ = &lt;HSTUFILE&gt;과 같습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; chop;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 맨 끝의 개행문자를 잘라 냅니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; last if( length( $_ ) &lt; 3 );&amp;nbsp; # 3은 큰 의미는 없지만 3 자도&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 안되면 자료가 아닌것으로 간주합니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( $stuid, $name, $year ) = split( ':', $_ );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $students{$stuid} = $name;&amp;nbsp; # hash&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $studyear{$stuid} = $year;&amp;nbsp; # hash&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( $maxnamelength &lt; length( $name ) )&amp;nbsp;&amp;nbsp;&amp;nbsp; # 가장 긴 이름에 맞&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp; $maxnamelength = length( $name );&amp;nbsp; } # 추어 출력.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; close Hstufile;&amp;nbsp; # 닫는것 기억하시죠 ?&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; open( Hscorefile, &quot;&lt;$scorefile&quot; )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || die &quot;Can\'t open $scorefile.\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while( &lt;HSCOREFILE&gt; )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; chop;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; last if( length( $_ ) &lt; 3 );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( $stuid, $examno, $score ) = split;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scores{ $stuid, $examno } = $score;&amp;nbsp; # 키가 2개입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # $stuid는 중복되므로...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( $examno &gt; $maxexamno )&amp;nbsp; # 학과가 몇개인지 셈.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { $maxexamno = $examno; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; close Hscorefile;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &quot;%3s %-${maxnamelength}s %4s&quot;, &quot;ID&quot;, &quot;Name&quot;, &quot;year&quot; );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # ${maxnamelength}처럼 { }를 사용하여 둘러 쌉니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 그렇지 않으면 $maxnamelengths 로 인식되겠죠. (s자 보이죠?)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ( 1..$maxexamno )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp; printf( &quot;%4d&quot;, $_ );&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &quot;%10s\n\n&quot;, 'Totals' );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach $stuid ( sort ( keys %students ) )&amp;nbsp; # sort함수는 배열내의&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 각 요소간의 문자열 비교로 전체 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 배열을 정렬한 배열을 리턴합니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &quot;%3d %-${maxnamelength}s %4d&quot;, $stuid,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $students{$stuid}, $studyear{$stuid} );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $total = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach $examno (1..$maxexamno)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &quot;%4d&quot;, $scores{ $stuid, $examno } );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $total += $scores{ $stuid, $examno };&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $examtotal{ $examno } += $scores{ $stuid, $examno };&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &quot;%10d\n&quot;, $total );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &quot;%3s %-${maxnamelength}s %4s&quot;, '', &quot;Total&quot;, '' );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $total = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach $examno (1..$maxexamno)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &quot;%4d&quot;, $examtotal{ $examno } );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $total += $examtotal{ $examno };&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &quot;%10d\n\n&quot;, $total );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이렇게&amp;nbsp; 보면 데이타베이스&amp;nbsp; 프로그램도&amp;nbsp; 못 만들건&amp;nbsp; 없겠군요. 사실&amp;nbsp; Perl에는 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; database와 연동하기 위한 함수들이 많이 있습니다. 그리고 Internet에 보면 많&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 은 database를 위한&amp;nbsp; Perl 라이브러리나 스크립트들이 많이&amp;nbsp; 있습니다. 이 글을 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 보시는 어느분 중에는 곧 그런 라이브러리를 만들어서 우리나라와 그리고 전 세&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 계에 나누어 주실 분도 계시리라는 생각도 드네요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ******( ${maxnamelength} ? )******&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 일반변수의 이름 주위에 {}로 둘러싼&amp;nbsp; 새로운 모습이 좀 이상하군요. 그러나 그 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 내용은 $maxnamelength와 하나도&amp;nbsp; 다를 바가 없습니다. 단지&amp;nbsp; 예제에서 그 뒤에 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 있는 s와의&amp;nbsp; 접촉으로 $maxnamelengths가 되어 해석이&amp;nbsp; 안되는 것을 막기위하여 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {}부호가 사용되는 것입니다. 이런 경우는 또 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $fruit = &quot;apple&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;I have five $fruits\n&quot;;&amp;nbsp; ???&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;I have five ${fruit}s\n&quot;;&amp;nbsp; !!!&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위의 경우처럼 변수와 어떤 문자를 바로 연결하여 사용할 때에는 반드시 {}부호&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 로 변수이름을 둘러싸야 한다는 사실을 기억하시기 바랍니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ***********************************&lt;BR&gt;&lt;BR&gt;22. 사용자 정의 함수 - Subroutine&lt;BR&gt;==================================&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 여기서는 간단한 소개만 하도록 하겠습니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 프로그램을 만들 수 있다면 함수는 왜 못만들겠수 ?&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Subroutine은 기존의 함수들로는 할 수&amp;nbsp; 없는 일을 반복적으로 하거나, 전체 프&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 로그램 운영상의 효율을 증대시키기 위해, 그리고 멋을 내고 싶을 때 만듭니다. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (왜 멋내면 안되우 ?)&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Subroutine은 다음과 같이 정의합니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sub mysubroutine&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Just print a simple message.\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위의 Subroutine은 그다지 유용한 프로그램은 아닌것 같군요. 하여간&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;mysubroutine;&amp;nbsp;&amp;nbsp; #&amp;nbsp; &amp; 를 붙여서 부릅니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이라고 하면, Just print a simple message.\n을 화면에 출력합니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Perl의 subroutine을 정의할 때는 인수의 종류나 개수 등을 특별히 정하지 않습&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 니다. 그저 사용할 뿐입니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 인수는 @_라는 특수한 배열로 전달됩니다. $_와는 별개의 존재인 것 아시지요 ? &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 눈의 착각일 뿐입니다. 각 subroutine은&amp;nbsp; 제 각기 자신의 @_를 가지고 있으므로 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subroutine에서 다른 subroutine을 부를 때&amp;nbsp; 공연한 걱정은 하지 않으셔도 됩니&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다. 다음을 한번 해 보세요.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # param.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sub args {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;@_\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sub bigargs {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # ( &quot;Shut&quot;, &quot;up,&quot;, &quot;please !&quot; )라는 배열이 넘어옵니다&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;args( &quot;Hello&quot;, &quot;there&quot;, &quot;?&quot; );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;@_\n&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;bigargs( &quot;Shut&quot;, &quot;up,&quot;, &quot;please !&quot; );&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 각각의 @_가 제 역할을 다 하는것이 보이시죠 ?&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @_도 배열이므로 $_[0], $_[1], $#_ 등 또한 제대로 사용할 수 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Subroutine은 마지막으로 도출된 값을&amp;nbsp; 리턴하거나 return이라는 함수로 명확하&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 게 표시하는 값을 리턴합니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # return.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $max = &amp;max( 10, 5 );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;$max\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $max = &amp;max( 8, 15 );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;$max\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sub max {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( $_[0] &gt; $_[1] )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { return $_[0]; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $_[1];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Subroutine밖에서의 변수들은 특별히 명시하지&amp;nbsp; 않는 한 subroutine의 안쪽에서&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 도 볼 수 있습니다. 볼 수 있다는 말은 변화시켜서는 않되는 변수의 값을 '실수&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 로 인하여' 변화 시킬 수 있다는 말입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # oooops.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $dum = &quot;Very very important data&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $max = &amp;max( 10, 5 );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;10, 5 - $max\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $max = &amp;max( 9, 14 );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;9, 14 - $max\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;$dum\n&quot;;&amp;nbsp;&amp;nbsp; #&amp;nbsp; oooops !!&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sub max {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $dum = ( $_[0] &gt; $_[1] ) ? $_[0] : $_[1];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이런 효과를 일부러 기대한 경우가 아니라면, 그리고 변수이름을 기필코 그렇게 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 하고 싶거나, 혹&amp;nbsp; 다른 사람이 라이브러리로 쓰려는것을&amp;nbsp; 예상하여 혹 있을지도 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 모르는 불미스러운&amp;nbsp; 일을 미연에&amp;nbsp; 방지하고 싶을 때는&amp;nbsp; local이라는 범위변경자&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (modifier)를 사용합니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ******( 연산자 ?: )******&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 위의 예제중에서 subroutine에 사용된 연산자&amp;nbsp; ?:는 조건의 참, 거짓에 따라 서&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 로 다른 값을 리턴하는 연산자입니다. 형식은&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (조건식) ? 참일때의_값 : 거짓일때의_값&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 입니다. 위의 예제의 경우 ( $_[0]&amp;nbsp; &gt; $_[1] )가 참일 경우 $_[0]을, 거짓일 경&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 우 $_[1]을 리턴함을 알 수 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다음은 위의 예제를 약간만 변형한 것입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # local.pl&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $dum = &quot;Very very important data&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $max = &amp;max( 10, 5 );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;10, 5 - $max\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $max = &amp;max( 9, 14 );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;9, 14 - $max\n&quot;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;$dum\n&quot;;&amp;nbsp; # Bueno ! No problemo !&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sub max {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local( $dum ) = ( $_[0] &gt; $_[1] ) ? $_[0] : $_[1];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 이 $dum은 바깥의 $dum과는 다릅니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 실험해 보셨지요 ?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; local은 변수를 '지역화'하므로써 subroutine 안팎의 변수이름이 같더라도 실제&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 의 '존재'는 다르게 조정합니다. 대표적인&amp;nbsp; 지역변수가 바로 @_, $_[0], $_[1], &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $_[2] .... 입니다. 위에서 보셨듯이 각각의 subroutine마다 서로 다른 @_를 가&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 지고 있었던것을 기억하실겁니다.&lt;BR&gt;&lt;BR&gt;# 다음번에는 몇가지 유용한 예제들을 만들어서 실험하면서 지금까지의 이야기들을&lt;BR&gt;# 한번 정리해 보도록 하겠습니다.&lt;BR&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 감사합니다.&lt;BR&gt;#&lt;BR&gt;# 전 종 필 올림.&lt;BR&gt;#&lt;BR&gt;
&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;&lt;/PRE&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;
&lt;TBODY&gt;&lt;/TBODY&gt;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>Perl을 배워보자</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/kihwanny/122"/>
		<id>tag:blog.daum.net,2009:kihwanny.122</id>
	    <author>
		    <name>기화니</name>
	    </author>
	    <updated>2009-01-09T15:23:39Z</updated>
	    <published>2009-01-09T15:23:39Z</published>
	    <content type="html">
	    	&lt;DIV style=&quot;TEXT-ALIGN: left&quot;&gt;perl compiler(&lt;A href=&quot;http://www.activestate.com/&quot; target=&quot;_blank&quot;&gt;&lt;FONT color=#0000ff&gt;여기&lt;/FONT&gt;&lt;/A&gt;)&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;TEXT-ALIGN: left&quot;&gt;설치를 하고&lt;/DIV&gt;
&lt;DIV style=&quot;TEXT-ALIGN: left&quot;&gt;print &quot;Hello, World!&quot;; 해보자!&lt;BR&gt;&lt;BR&gt;링크들&lt;BR&gt;&lt;A href=&quot;http://www.activestate.com/&quot; target=&quot;_blank&quot;&gt;&lt;FONT color=#013add&gt;http://www.activestate.com/&lt;/FONT&gt;&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://members.tripod.com/~bank123/p01.html&quot;&gt;&lt;FONT color=#013add&gt;http://members.tripod.com/~bank123/p01.html&lt;/FONT&gt;&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://search.cpan.org/dist/WWW-Mechanize/&quot; target=&quot;_blank&quot;&gt;&lt;FONT color=#013add&gt;http://search.cpan.org/dist/WWW-Mechanize/&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;
	    </content>
	    	</entry>
      </feed>
