Home Map Index Search News Archives Links About LF
[Top bar]
[Bottom bar]
[Photo of the Author]
�۾��� Guido Socher

�۾��� �Ұ�:

Guido�� �������� ������ ���̾��� Perl ��Ŀ����. ���� �״� ���� ���Ӱ� �����ϰ� ������ ������� �ٸ� �͵��� �ɾ� Ű��µ� ��ô �ٻڴ�.

����:

Perl �ι�°

[Illustration]

���:

Perl ù��°������ ���� �Ϲ����� ������ ���캸�Ҵ�. perl part II������ ù��° �������� ���α׷��� �ۼ��Ѵ�.



����� ���α׷� ����

���� Ưȭ�� �� �½�ũ�� ���� ���α׷��� �ۼ��ϴµ� �ּ��� �����̴�. ��κ��� ���α׷��鿡�� ����� �Ϸ��� �ϴ� ����̳� ����� ������ ������ �����ϴ� Ʋ�� ������ �׷����� ���� ���� ���μ����� �ӵ������ ���ؼ� �ſ� ���� �����̴�. ������ code template�� ������ �ɼ� ���ɾ�� ������ ����Ʈ�ϴ� �����ƾ�� �����Ѵ�.
 
!/usr/bin/perl -w
# vim: set sw=8 ts=8 si et:
#
# uncomment strict to make the perl compiler very
# strict about declarations:
#use strict;
# global variables:
use vars qw($opt_h);
use Getopt::Std;
#
&getopts("h")||die "ERROR: No such option. -h for help\n";
&help if ($opt_h);
#
#>>your code<<
#
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
sub help{
print "help message\n";
exit;
}
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
__END__

�ڵ带 ���� &getopts()�� ���ɾ� �ɼ��� �б� ���� ���̺귯�� Getopt::Std �� �ִ� �����ƾ�� ȣ���Ѵ�. �� �Լ��� ���ɾ� �ɼǿ� ���� ������ ���� ���� $opt_<option>�� �����Ѵ�. ���ɾ� ���� ��� �ɼ��� "-" (minus sign)���� �����ϰ� ���α׷� �̸��� �ٸ� ���� ���̿� �´�. (Note: �̰��� �Ϲ����� Unix ��Ģ�̴�.) &getopts�� �־��� ���ڿ�(���� ���α׷������� "h")�� ���α׷��� ����ϴ� ��� �ɼ��� �����ϰ�, ���� �ɼ��� �ݷ����� �� ������ ������ �ִٸ� �ɼ� ���ڴ� �ݵ�� �ݷеڿ� �־�� �Ѵ�. &getsopt("d:x:h")�� ���α׷��� -d, -x, -h��� �ɼ��� ������ �ִٴ� �ǹ��̴�. �ɼ� -d�� -x�� �ƱԸ�Ʈ�� ������ �ֱ� ������ "-o somgthing"�� �´� �������� "-o -x foo"�� -o �ڿ� �ƱԸ�Ʈ�� ���� ������ Ʋ�����̴�.
���� �ɼ� -h�� ���ɾ�� �־����ٸ� $opt_h������ &help�� ��������. �׸��� ($opt_h);�� help�� �������Ƿ� �ɼ� -h�� ���ɾ�� �־����� �����ƾ help�� �ҷ����ٰ� �� �� �ִ�. sub help{������ �����ƾ�� �����ϴ� ���̴�. ���� �̼��� �� ��� �ڵ��� �ڼ��� �κ��� �����ϴ� ���� �߿�ġ �ʴ�. ���� �ʿ��Ҷ� ����� �ֿ� ��ɿ� �� template�� ����� �� ������ �ȴ�.

template ����ϱ�

�� ������ ����Ͽ� ���� �� ��ȯ�⸦ ����� ����. 16������ 10������ ��ȯ��Ű�� �� ���α׷��� �̸��� numconv��� �Ѵ�.
numconv -x 30 10���� 30�� ���� 16������ ����Ʈ �Ѵ�.
numconv -d 1A 16���� 1A�� ���� 10������ ����Ʈ �Ѵ�.
numconv -h ������ ����Ʈ �Ѵ�.
�� �Լ� hex()�� 16������ 10������ �ٲٰ� printf()�� 10������ 16������ �ٲٴµ� ����� �� �ִ�. �� �Լ����� �츮�� template���� ������ �Ǹ��� ���α׷��� �� �� �̴�.
 
#!/usr/bin/perl -w
# vim: set sw=8 ts=8 si et:
#
# uncomment strict to make the perl compiler very
# strict about declarations:
#use strict;
# global variables:
use vars qw($opt_d $opt_x $opt_h);
use Getopt::Std;
#
&getopts("d:x:h")||die "ERROR: No such option. -h for help\n";
&help if ($opt_h);
if ($opt_d && $opt_x){
    die "ERROR: options -x and -d are mutual exclusive.\n";
}
if ($opt_d){
    printf("decimal: %d\n",hex($opt_d));
}elsif ($opt_x){
    printf("hex: %X\n",$opt_x);
}else{
    # wrong usage -d or -x must be given:
    &help;
}
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
sub help{
    print "convert a number to hex or dec.
USAGE: numconv [-h] -d hexnum
    umconv [-h] -x decnum

OPTIONS: -h this help
EXAMPLE: numconv -d 1af
\n";
    exit;
}
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
__END__

���� numconv���α׷��� �ٿ�ε� �������� Ŭ���Ͻÿ�.
���� �忡���� �츮�� �� ���α׷��� ���� ���� ģ���������̴�. ������ �α⸦ �ٶ���.

If-����

�ȿ��� 2���� ������ if ������ �ִ�.:
expr if (cond);
or
if (cond) BLOCK [[elsif (cond) BLOCK ...] else BLOCK]

BLOCK�� {}�ȿ� �ִ� ������ ���� �ǹ��Ѵ�. �̰��� If������ ������ ���� ���� �� �ִٴ� ���� �ǹ��Ѵ�.:
 

printf("hello\n") if ($i);

if ($i == 2){
   printf("i is 2\n");
}elsif ($i == 4){
   printf("i is 4\n");
}else{
   printf("i is neither 2 nor 4\n");
}

�޿����� C���� ���� ��ó�� && �� || �����ڸ� �� �� �ִ�.
printf("hello\n") if ($i);
���� ���� �ڵ�� �Ʒ��� ���� ���� �� �ִ�.
($i) && printf("hello\n");
Ư���� ||�� template�ȿ��� ���� �� ����ȿ� �� �� �� �ִ�.
&getopts("d:x:h")||die "ERROR\n";
"�ɼ��� ������ �������� ������ ������.". die() �Լ��� �⺻������ ���α׷��� ������ ����Ʈ ���� �����ϴ� �Ͱ� ���� ����� �Ѵ�. �� �Լ��� �޽����� ����Ʈ�ϰ� ���α׷��� ������ �ȴ�.
&getopts("d:x:h")||die "ERROR\n";
�̰��� ������ ���� �����̴�.
die "ERROR\n"; if (! &getopts("d:x:h"));
"!"�� ���������� ���� �������̴�. �ٽ� �̰��� ������ ���� ���� �� �ִ�.
die "ERROR\n"; unless (&getopts("d:x:h"));
unless�� if-not�� ���� ���̰� if(!..) ���� �бⰡ ���ϴ�.

����� ���Ͱ� ���� �޿����� if-������ ���µ� �Ѱ��� ����� �ִ°��� �ƴϴ�. �� ��� ����� �� �� �ʿ�� ����, ����� ���⿡ ���� ����� ���� �ȴ�.

����

ù��° �� ���� �츮�� ���� ���ϰ� ���̴� scalar ����($-����)�� �þ���. �� �������� ���Ǵ� ������ �����ϰ� �ȴ�. �̰��� ���� ���α׷������� ���� ���� ��������� ū ���α׷������� ã�� ���� ������ ���� ��ų �� �ִ�. ������ ������ �����Ϸ����� Ÿ�� ������ ýũ�ϰ��Ͽ� �̷� ���ɼ��� �� �� �� �ִ�.
"use strict;"�� ��� ������ ����ǵ��� �Ѵ�. 
������ ���� ��Ȯ�� �ڵ带 ���� ���̸�:
#!/usr/bin/perl
use strict;
my $i=1;
print "i is $i\n";

�� ���α׷��� ��Ȯ�ϰ� i�� 1�̶�� ����� ����Ѵ�. ���� �Ǽ��� ���� i ��ſ� j�� ��ٰ� �����ϸ�:

#!/usr/bin/perl
#
$i=1;
print "i is $j\n";

�� �ڵ�� �޿��� �� ����ɰ��̰� "i is "��� ����� ����Ѵ�. �� ��� "use strict;"�� �����Ϸ����� �̷��� ���α׷��� �߸���ٴ� ���� �˸���. "strict"�� ���� ��� ������ ����Ǿ� �ǰ� ���� ���α׷��� ���� �޽����� ��µȴ�.
 

#!/usr/bin/perl
use strict;
my $i=1;
print "i is $j\n";

�� ���α׷��� ������ ���� �޽����� ����ϰ� ���� ����� ���� �Ѵ�.

Global symbol "$j" requires explicit package name at ./vardec line 4.
Execution of ./vardec aborted due to compilation errors.
Exit 255
�޿��� ������ "my"�� ����Ͽ� ����ǰų� framework���� ���ΰͰ� ���� "use vars qw()"�� ����Ͽ� ����ȴ�.:
use vars qw($opt_h);

���� ������ use vars�� ���� ����ȴ�. �̷��� �������� ���̺귯���� �����ϴ� ��� �ڵ忡�� �������̴�.
���� ���α׷� ȭ�Ͼȿ��� �������� ����(ȭ�Ͼ��� ��� �����ƾ�ȿ����� �������̴�.)�� �����ƾ �ٱ��� ���α׷��� ���ۺκп� my �� ����Ͽ� ����ȴ�.
���� �����ƾ �ȿ��� �������� ������ �����ƾ �ȿ��� my�� ����Ͽ� ����ȴ�.

������� �� ���α׷��ֿ��� ������ �����ϰų� ���� �Ҵ��� �� $ ǥ�ø� ���� �ϴ� ������ �ִ�. �̰��� �޿����� �Ұ����ϸ� ��Į�� ������ ����Ҷ��� �׻� $ ǥ�ø� ����Ѵ�.

�׸��� ������ �����Ҷ� ���� ���� �Ҵ��Ҷ��� ���� �� �ִ�. my $myvar=10; �� $myvar�� �����ϰ� �� ������ �ʱⰪ���� 10�� �Ҵ� �Ѵٴ� �ǹ��̴�.

���η�ƾ

�츮�� ���� numconv ���α׷����� "help" �����ƾ�� ����ϴ� ���� �̹� �����. �����ƾ�� ����� ���ϴ� ����� ���α׷��ϴµ� ���� �� �ֱ� ������ �̷��� �����ƾ�� ����� ���α׷� ������ ������ �� ���̴�.
�����ƾ�� ���α׷��ȿ��� ��� ��ġ���� ���Ե� �� �ִ�.(�����ƾ�� ȣ��DZ� ���̵� ȣ��� �ڿ� �������� ����� ����.) �����ƾ�� sub name(){... �� ���۵ǰ� �����ƾ�� ȣ���ϱ� ���ؼ��� $retval=&name(...arguments...) �� ���� �������� ȣ���ؾ� �Ѵ�. �����ƾ �ȿ��� ���������� ����� ������ ���� ���� ���̴�. �����ƾ�� �־��� �Ű��������� Ʊ���� �迭�� @_�� ���� �����ƾ���� �ڵ忡�� ���޵ȴ�. �迭�� ���� �� �ڼ��� ������ ������ ���翡 ������ �����̰�, ���, �����ƾ �ȿ��� shift�� ����� ��Į�� ������ ���� �д� ����� �˾ƺ���. ���⿡ ���� �� �ִ�:
 
#!/usr/bin/perl
use strict;
my $result;
my $b;
my $a;
$result=&add_and_duplicate(2,3);
print "2*(2+3) is $result\n";

$b=5;$a=10;
$result=&add_and_duplicate($a,$b);
print "2*($a+$b) is $result\n";

# add two numbers and multiply with 2:
sub add_and_duplicate(){
    my $locala=shift;
    my $localb=shift;
    ($localb+$locala)*2;
}

���� ���α׷�

���� �� ������ �� ����� ���� ���� ��Ҹ� ��� ����, ������ ���� ���α׷��� �ۼ��� �ð��̴�.
���� ���� ���α׷��� ������� �ؽ�Ʈ ȭ���� �ٷ�� ���� ������ �Ǿ���. �츮�� ù��° �� ���α׷��� ��� ����Ʈ�� ���ؼ� ����Ʈ �ȿ��� �ߺ��� ���� ã�� ���α׷��̴�. �ߺ��̶�� ���� ����Ʈ�ȿ��� ������ �߰ߵǴ� �� �̾߱� �ϸ� �� ����Ʈ�� ������ ���� ǥ���ȴ�.:
���� ����ؼ� �ؽ�Ʈ ������ �ٷ�� ���� �ſ� ����.  
AC Access Class
AC Air Conditioning
AFC Automatic Frequency Control
AFS Andrew File System
...
�� ����Ʈ ȭ���� �̰����� �ٿ�ε� �� �� �ִ�. �� ������ ������ ������ ����.: �� �ؽ�Ʈ ������ ��� ���� ���ΰ�? ���⿡ �ٴ����� �ؽ�Ʈ�� �о���̴� �ڵ尡 �ִ�.:
 

....
open(FD,"abb.txt")||die "ERROR: can not read file abb.txt\n";
while(){
   #do something
}
close FD;
....

open �Լ��� ���� �����ڸ� ù��° �������ڷ� ���� ���� �̸��� �ι�° �������ڷ� ������. ���� �����ڴ� Ư���� �����̴�. �̰��� open�Լ��� ���� �Լ� �ȿ��� ���Ͼȿ��� �ڷḦ ���� �� �ְ�, ���������� close �Լ��� �����Ѵ�. <FD>�� ������ �д� ���� ������ <FD>�� while loop�� ���ڷ� �־��� �� �ְ� �̰�� �� ������ ������ �дµ� ���ǰ� �ȴ�.
���������� ���� �����ڴ� �޿��� �빮�ڷ� ǥ�õȴ�.

������ �ڷ�� ��� ������? ���� ����� �������� ������ ������ �ִ�. �̷� �������� ���� ���� ���̴µ� �׻� �����Ѵ�. ���� �Ѱ����� $_ ������ �ִ�. �� ������ ���� while loop���� ���� �о���� �� ������ ������ ������ �ִ�. �ѹ� ������ �ڵ带 ���� �غ��⸦:(�ڵ� �ޱ� ):
 

#!/usr/bin/perl
use strict;
my $i=0;
open(FD,"abb.txt")||die "ERROR: can not read file abb.txt\n";
while(<FD>){
   # increment the line counter. You probably
   # know the ++ from C:
   $i++;
   print "Line $i is $_";
}
close FD;
�������� ���� $_�� �� ������ ������ �ִ�.

���̴� ��ó�� ���� �ڵ�� print "Line $i is $_ \n"�� ���� ������ �ʾҴµ�, �̰��� $_ ������ �ؽ�Ʈ ȭ�� �ȿ��� ���� ����(\n)�� ���� �о� �鿴�� �����̴�.

���� �츮�� ������ �д� ����� �˾Ҵ�. Ȯ���ϰ� �츮�� ���α׷��� ������ ���ؼ��� �츮�� �ΰ��� ������ �� ����� �Ѵ�.

  1. ��� �� ������ ���ۿ��� �� �о���� ���ΰ�?
  2. �޿��� �ؽ� ���̺��� ��� �۵��ϴ°�?
���� ǥ�� �ؽ�Ʈ ���ڿ��ȿ��� Ư�� ������ ã������ ������ �ǹ̸� �����մϴ�. �츮�� �� ���ξȿ��� ù��° ���� ������ ù��° ���ڿ��� ã�ƾ� �մϴ�. �ٸ� ���� ǥ���ϸ� �츮�� ������ "������ ���� --> ������� ���ڵ� --> ����" �Դϴ�. ���� ����ǥ�������� �̰��� ^\S+\s�� ���� ǥ�� �մϴ�. �̰��� m//�ȿ� ���� ������ ���� �� ǥ���� $_ ������ ����ֽ��ϴ�. (���: �� ������ ���� ������ ������ �ֽ��ϴ�. �׷���??). \S+�� ����ǥ���Ŀ��� "������ ���� ���ڵ�" �̶�� �Ͱ� ���� �ǹ��Դϴ�. ���� ���α� \S+�� ���� ()�� �ѷ� �θ� ������ �ƴ� ���ڵ��� ���� $1�� ���� �ְ� �˴ϴ� �̰��� �츮�� ���α׷� �� ��������� �Ʒ��� �����ϴ�.:
#!/usr/bin/perl -w
# vim: set sw=8 ts=8 si et:

use strict;
# global variables:
use vars qw($opt_h);
my $i=0; 
use Getopt::Std;
#
&getopts("h")||die "ERROR: No such option. -h for help.n";
&help if ($opt_h);
#
open(FD,"abb.txt")||die "ERROR: can not read file abb.txt\n"; 
while(<FD>){ 
    $i++; 
    if (m/^(\S+)\s/){
        # $1 holds now the first word (\S+)
        print "$1 is the abbreviation on line $i\n"; 
    }else{
        print "Line $i does not start with an abbreviation\n";
    }

close FD; 
#
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
sub help{
     print "help text\n";
     exit;
}
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
__END__ 

���� ���� ǥ���� ���� ���ο� ���������� ������ �Ǹ�, ��ġ ������ (m/ /)�� 1�� ��ȯ�մϴ�. �׷��Ƿ�, if-����ȿ� �� ���� ����� �� �ֽ��ϴ�. $1 ������ ������ Ȯ���� �ڷᰡ �ִ��� Ȯ�εǾ� �ϱ� ������ $1 �������� ����ϱ� ���� �� �� ��ġ �����ڿ� if-������ ����Ͽ��� �Ѵ�.

�ؽ� ���̺�

���� �츮�� ȭ���� �а�, �� ���´�. �׸��� �������� ���� ������ �͵��� ������ �� ������ ���������� �˾ƿ��� ���� �ʿ��� �������̴�. ���� �츮�� ���ο� �� ������ Ÿ���� �ʿ��ϴ�: Hash Tables. �ؽ� ���̺��� ���ڿ��� ���� �ε��� �ɼ� �ִ� �迭�̴�. ���� �̸� �տ� % ǥ�ø� �ٿ��� �ؽ� ���̺��̶�� ���� ��Ÿ����. ������ ���� �б� ���ؼ� $variable_name{"index_string"}�� ���� ������ ����ؾ� �Ѵ�. �ٸ� ��Į�� ������ ���� �ؽ� ���̺����� �ʵ�� �Ϲ����� ��Į�� ������ ���� ���ȴ�. ����:
 
#!/usr/bin/perl -w
my %htab;
my $index;
# load the hash with data:
$htab{"something"}="value of something";
$htab{"somethingelse"}=42;
# get the data back:
$index="something";
print "%htab at index \"$index\" is $htab{$index}\n";
$index="somethingelse";
print "%htab at index \"$index\" is $htab{$index}\n";

�� ���α׷��� ����ɶ� �츮�� ���� �� �ִ� ����:

%htab at index &quotsomething"�� "value of something"�̰�
%htab at index &quotsomethingelse" �� 42��� ���̴�.
���� �츮�� ���α׷��� ���� ����:
 1  #!/usr/bin/perl -w
 2  # vim: set sw=4 ts=4 si et:
 3  # 
 4  use strict;
 5  # global variables:
 6  use vars qw($opt_h);
 7  my %htab;
 8  use Getopt::Std;
 9  #
10  &getopts("h")||die "ERROR: No such option. -h for help.n";
11  &help if ($opt_h);
12  #
13  open(FD,"abb.txt")||die "ERROR: can not read file abb.txt\n"; 
14  print "Abbreviations with several meanings in file abb.txt:\n";
15  while(<FD>){ 
16      if (m/^(\S+)\s/){
17          # we use the first word as index to the hash:
18          if ($htab{$1}){
19              # again this abbrev:
20              if ($htab{$1} eq "_repeated_"){
21                  print; # same as print "$_";
22              }else{
23                  # this is the first duplicate we print first
24                  # occurance of this abbreviation:
25                  print $htab{$1};
26                  # print the abbreviation line that we are currently reading:
27                  print;
28                  # mark as repeated (= appears at least twice)
29                  $htab{$1}="_repeated_";
30              }
31          }else{
32              # the first time we load the whole line:
33              $htab{$1}=$_;
34          }
35      }
36  } 
37  close FD; 
38  #
39  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
40  sub help{
41          print "finddup -- Find abbreviations with several meanins in the
42  file abb.txt. The lines in this file must have the format:
43  abrev meaning
44  \n";
45          exit;
46  }
47  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
48  __END__ 
������� �� ������ �� ���α׷��� �ٿ� ���� �� �ִ�.

�� ���α׷��� ��� �۵��ϴ°�? �� ���α׷��� ���� ������ ������ �а�, �� ������ %htab (line 33)��� �ؽ� ���̺��� �����Ѵ�. How does it work? We read the file line by line and store the lines in our hash called %htab (line 33). �ؽ� ���̺��� �ε����� ����̴�. �ؽ� ���̺��� ����ϱ� ���� �� �ȿ� �ٸ� ���� ����Ǿ� �ִ��� Ȯ���Ѵ�. (line 18). ���� �ؽ� ���̺��ȿ� �ٸ� ���� ������ �� ���� ���ɼ��� �ִ�.

  1. �̰��� ù��° �ߺ��̴�.
  2. �� ���� �̹� ������ �ߺ��Ǿ� �ִ�.
�� �ΰ��� ��츦 �����ϱ� ���� "_repeated_"��� ���ڿ��� �ؽ� ���̺��ȿ� �Ἥ �̹� �ߺ��Ǿ��ٰ� �߰ߵ� �͵��� ǥ���Ѵ�.(line 29)

�� �ڵ�� �������� �ٿ� ���� �� �ְ� �ѹ� ������ ���⸦ �ٶ���.

���� ���翡����...

�̹� ���翡�� ����� �̹� �� ����� ��� �ڼ��� �κе��� �����. ���� ���� ���� ��� ������ Ÿ���� �ٷ����� �ʾ�����, ����� �޿��� "abb.txt" �� ���� ������ ȭ�� �̸��� ����ϴ� ���� ���� �� �ִ��� �ñ��� �� �� ������, ����� �̹� ȭ�� �̸��� �ڵ�ȿ� Ȯ����Ű�ʰ� �ɼ��� ����� ���������� ȭ�� �̸��� �����ϴ� ����� �˰��ִ�. (��: finddup -f abb.txt) ���� �������� �ٲ㼭 �ڵ��غ��⸦ �ٶ���. ���ɾ� ���ΰ� ������Ÿ�� �迭�� �д� �Ϲ����� ����� ���� ���翡 �Ұ��� ���̴�.  
�� �� �������� ��������Ŀ�� ������ ���� ���� ���� �˴ϴ�.
© Guido Socher 
LinuxFocus 1999
��������:
���� : ����
en -> kr : ���

1999-11-01, generated by lfparser version 0.8