Perl II

ArticleCategory:

Software Development

AuthorImage:

[×÷Õß]

TranslationInfo:

original in enGuido Socher

en to gb Xiang Hong

AboutTheAuthor:

Guido��һ�����ʸ��Linux�Ժ�Perl�����ߡ� �������æ���޷��Ӻ��ڻ�԰���ֲ�ʲô�ġ�

Abstract:

ǰһƪ����Perl I�����˶�Perl���Ե�һ������������� ����ƪ���������ǽ�ѧϰ��α������ǵĵ�һ�����õ�Perl����

ArticleIllustration:

[Illustration]

ArticleBody:[The article body]

һ��������

Perl�ر��ʺ���������С�͵�ר�ó��� Ϊ�˼ӿ쿪�����ȣ�����һ�����ṩ���������Ҫ�õ��Ĺ��ܺͽṹ�Ļ�����ܣ� ������һ�������⡣ �����һ�δ����ṩ�˻�����������ѡ����������Լ�һ�� ��ӡ������Ϣ�������̡�

!/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_<ѡ��>��ֵ�����е�������ѡ���"-"�����ţ���ͷ��������λ�ڳ����� ����������֮�䣨����Unixϵͳ��һ��Լ������ ����"&getopts"һ���ض����ַ�����������ij�������"h"�����г����пɽ��ܵ�ѡ� ��ijѡ��Ҫ��һ�����������ڸ�ѡ��֮��Ӧ����һ��ð�š�����˵��"&getsopt("d:x:h")"��ʾ���������ѡ�� "-d"��"-x"��"-h"������"-d"��"-x"��Ҫһ�������� �Ӷ�"-d something"��һ���ɽ��ܵ������У���"-d -x foo"�Ǵ���ģ���Ϊѡ��"-d"û�в�����
��������и�����"-h"�����������"$opt_h"����ֵ��"&help if ($opt_h);" ������������help�� ���"sub help{"�Ƕ���������̵�������
��������ڻ�û����ȫ�˽����е�ϸ�ڣ���Ҫ��������԰���δ��뵱��һ��ģ�壬������������ϣ���еĹ��ܡ�

ʹ�����ģ��

�������������ģ��дһ��СС��16����/10��������ת�����򣬲�������"numconv"��
"numconv -x 30 "�����10������30��16������ʽ��
"numconv -d 1A "�����16������1A��10������ʽ��
"numconv -h "���������Ϣ��
������Perl����"hex()"���16���Ƶ�10���Ƶ�ת��������"printf()"���10���Ƶ�16���Ƶ�ת���� �����Ǽ������ǵ�ģ���У��õ��������Ư���ij���

#!/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-���

Perl�е�if�����������ʽ��
����ʽ if (����);
��
if (����) ��1 [[elsif (����) ��2 ...] else ��3]

����"��"�ɻ�����{}��Χ�������������ɡ� ���磺

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");
���ǵ�ģ���ж�"||"��ʹ�ÿ��Ա��ܺõķ���ɷ��Ͽ���ϰ�ߵľ��ӣ�
&getopts("d:x:h")||die "ERROR\n";
"�����߳ɹ��ģ����������ѡ������˳�"��
����"die"�൱��"printf"��"exit"�����������һ����Ϣ����ֹ����
&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(!..)".

����Դ�if������������д����ѡһ���������ϰ�ߵġ�

����

��Perl I�У� ������ʹ�ñ�����������$��ͷ�ı�����֮ǰ��û�������� �������ڱ�ʹ�õ�ʱ�򱻴����ġ� ����С������˵����������˾��úܷ��㣻�����ڴ�ij���������Ժ����׵���ijЩ���ڷ��ֵĴ��� ��������������ʹ���������ܹ�����ijЩ���ʹ���
"use strict;" ǿ�����б�����Ӧ��������
���������������

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

�����������ȷ�ģ��������������"i is 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";

����ij��򽫵������´�����Ϣ��ͬʱ��λ���������ʮ�����ף�

Global symbol "$j" requires explicit package name at ./vardec line 4.
Execution of ./vardec aborted due to compilation errors.
Exit 255

������"my"����һ�����ֲ���������Ҳ�����������ǵ�ģ���������� ��"use vars qw()"���������磺
use vars qw($opt_h);

��"use var"������ȫ�ֱ�������Ч��Χ���쵽�������Ŀ��С�
�ڳ���Ŀ�ͷ���κ�������֮�⣩��"my"�����ı���ֻ�ڵ�ǰ���� �ļ����������ļ��е����������̣�����Ч��
�����̵ľֲ������ڸ�����������"my"��������

ϰ����shell��̵��˿��ܻ��������������������ֵʱ����"$"���š� ����һ�ִ�������������ۺ�ʱ��ֻҪ����ʹ��һ������������"$"���� ���DZ���ġ�

����������ʱҲ����ֱ�Ӹ�ֵ����"my $myvar=10;"�����˱���"$myvar" ͬʱΪ�丳��ֵ10��

������

�������"numconv"�����������Ѿ�ʹ����"help"�����̡� �����̵�ʹ�ÿ���ʹ����ṹ��������
�����ڳ�����κεط����������̣��ڵ���֮ǰ��֮�󶼿��ԣ��� ��������"sub name(){..."��ʼ���������ʽ��"$retval=&name(...arguments...)"�� �����̵ķ���ֵ�������һ����ִ�е����Ľ������������ͨ��һ�����������"@_"��ɡ� ���ǽ���Perl III����ϸ�������飬����ֻҪ֪�����������ڿ�����"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;
}

һ��ʵ�õij���

�����Ѿ�֪���˲��ٹ���Perl�Ļ���֪ʶ�����ڿ���дһ�����õij����ˡ�
Perl�����Ŀ���Ƿ����ı��ļ��Ĵ����� ���ǵĵ�һ��Perl���򽫴���һ����д���ʵ��б��������ҳ��ظ���� �����д���ʵ��б��������������ģ�
��Perl�����ı������Ǻ����׵�

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"������ij�����ļ��ض�ȡ���ݵĺ������Լ�"close"������ʹ����������� ���ļ��ж�ȡ��������<FD>��ɵġ�<FD>���Ա��ŵ�һ��"while"ѭ������ʵ�ְ��ж�ȡ��
һ��ģ�Perl���ô�д��ĸ���б�ʾһ���ļ���������
��ô���������Ķ�ȥ�ˣ�Perl�в����������������Dz���Ҫ�������������Ǵ��ڵġ�"$_"��������֮һ�� �������"while"ѭ���У�����������������һ�ζ�����С� ���������ԣ������ش�������

#!/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"����

�ã����������Ѿ�֪����ζ��ļ��ˣ���Ҫ������ǵij�����Ҫ֪����

  1. ���������׶��뵥����д��
  2. ����ʹ��Perl�еĹ�ϣ����

�������ʽ�ṩ�����ı�������Ѱ�ض�ģʽ�����������������Ҫ�õ� ÿ���е�һ���ո�֮ǰ���ַ��������仰˵������ҪѰ�ҵ�ģʽ�ǣ�"����-->�ǿո��ַ�����-->�ո�"�� ��Perl���������ʽ����ʾ���ǣ�"^\S+\s"�������ŵ�"m//;"��ȥ�� Perl��������������ʽ��ƥ��"$_"�������������������ǰ�У����ǵ��𣿣� ���е�"\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" ����С����"if"����DZ�Ҫ�ģ���Ϊ��Ҫ��֤����"$1"�к�����Ч�����ݡ�

 

��ϣ��

�����Ѿ����Զ��ļ������л�õ�����д�ˡ�ʣ�µ������ǣ����ǻ���Ҫij�ַ������ж� ij����д�Dz����Ѿ������ˡ�������Ҫһ���µ��������ͣ���ϣ���� ��ϣ����һ�����ַ�����Ϊ���������顣��ʾ������ϣ���ı�����"%"��ͷ�� ͬʱ����ͨ��"$������{"�����ַ���"}"�����ñ��е�ij��Ԫ�ء� �����"$"���Ÿ���������ǰ���"$"��һ���ģ���Ϊ��ϣ���е�һ��Ԫ��ʵ���� ����һ����ͨ�ı���������
һ�����ӣ�

#!/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 "something" is value of something
%htab at index "somethingelse" is 42

���ˣ����������ij����ǣ�

 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" �Ĺ�ϣ���������ݣ�33�У����ù�ϣ�����������ǵ�����д����Ϊ��ϣ����ij��Ԫ�ظ�ֵ֮ǰ�� ����Ԫ���Dz����Ѿ�����ֵ�ˣ�����ǣ��������ֿ����ԣ�

  1. �Ǹ���д�ĵ�һ���ظ�
  2. �Ѿ����ǵ�һ���ظ���
Ϊ����������������ڳ����״��ظ�֮��Ϊ��ϣ������ӦԪ�ظ�ֵ"_repeated_"��29�У���

�����������������Լ����ԡ�

��

����ƪ���������Ѿ�ѧ����Perl��һЩϸ�ڣ������Dz�û�����۵�Perl�������������͡� �������֪����û��ʲô�취���Բ����������������ļ���"abb.txt"Ӳ���뵽������ȥ�� ʵ���ϣ����Ѿ�ѧ�������ͨ��ʹ��������ѡ����������һ�㣨���磺finddup -f abb.txt����
�����޸��������
��һƪ���½����۶�ȡ�����е�һ�㷽���Լ��µ��������ͣ����顣