learnxinyminutes-docs/zh-cn/perl-cn.html.markdown
sumanstats 0ecb826429 Perl6 to Raku and many more
+ As the Perl 6 is renamed to raku, it is good to reflect that https://github.com/Raku/problem-solving/blob/master/solutions/language/Path-to-Raku.md

+ perl6.org is now raku.org
+ change references of perl 6 to raku
+ rename file perl6-pod.html.markdown to raku-pod.html.markdown
+ Perl refers to Perl 5, there is no ambiguity after rename of Perl6 to
  Raku, use Perl only to refer to Perl 5
+ fix links inside raku.html.markdown
2020-06-10 16:33:01 +05:45

3.8 KiB
Raw Blame History

name category language filename contributors translators lang
perl language perl learnperl-cn.pl
Korjavin Ivan
http://github.com/korjavin
Yadong Wen
https://github.com/yadongwen
zh-cn

Perl 是一个功能强大、特性齐全的编程语言有25年的历史。

Perl 可以在包括便携式设备和大型机的超过100个平台上运行既适用于快速原型构建也适用于大型项目开发。

# 单行注释以#号开头


#### Perl的变量类型

#  变量以$号开头。
#  合法变量名以英文字母或者下划线起始,
#  后接任意数目的字母、数字或下划线。

### Perl有三种主要的变量类型标量、数组和哈希。

## 标量
#  标量类型代表单个值:
my $animal = "camel";
my $answer = 42;

# 标量类型值可以是字符串、整型或浮点类型Perl会根据需要自动进行类型转换。

## 数组
#  数组类型代表一列值:
my @animals = ("camel", "llama", "owl");
my @numbers = (23, 42, 69);
my @mixed   = ("camel", 42, 1.23);



## 哈希
#  哈希类型代表一个键/值对的集合:

my %fruit_color = ("apple", "red", "banana", "yellow");

#  可以使用空格和“=>”操作符更清晰的定义哈希:

my %fruit_color = (
        apple  => "red",
        banana => "yellow",
        );
# perldata中有标量、数组和哈希更详细的介绍。 (perldoc perldata).

# 可以用引用构建更复杂的数据类型,比如嵌套的列表和哈希。

#### 逻辑和循环结构

# Perl有大多数常见的逻辑和循环控制结构

if ( $var ) {
    ...
} elsif ( $var eq 'bar' ) {
    ...
} else {
    ...
}

unless ( condition ) {
                   ...
               }
# 上面这个比"if (!condition)"更可读。

# 有Perl特色的后置逻辑结构
print "Yow!" if $zippy;
print "We have no bananas" unless $bananas;

#  while
  while ( condition ) {
                   ...
               }


# for和foreach
for ($i = 0; $i <= $max; $i++) {
                   ...
               }

foreach (@array) {
                   print "This element is $_\n";
               }


#### 正则表达式

# Perl对正则表达式有深入广泛的支持perlrequick和perlretut等文档有详细介绍。简单来说

# 简单匹配
if (/foo/)       { ... }  # 如果 $_ 包含"foo"逻辑为真
if ($a =~ /foo/) { ... }  # 如果 $a 包含"foo"逻辑为真

# 简单替换

$a =~ s/foo/bar/;         # 将$a中的foo替换为bar
$a =~ s/foo/bar/g;        # 将$a中所有的foo替换为bar


#### 文件和输入输出

# 可以使用“open()”函数打开文件用于输入输出。

open(my $in,  "<",  "input.txt")  or die "Can't open input.txt: $!";
open(my $out, ">",  "output.txt") or die "Can't open output.txt: $!";
open(my $log, ">>", "my.log")     or die "Can't open my.log: $!";

# 可以用"<>"操作符读取一个打开的文件句柄。 在标量语境下会读取一行,
# 在列表环境下会将整个文件读入并将每一行赋给列表的一个元素:

my $line  = <$in>;
my @lines = <$in>;

#### 子程序

# 写子程序很简单:

sub logger {
    my $logmessage = shift;
    open my $logfile, ">>", "my.log" or die "Could not open my.log: $!";
    print $logfile $logmessage;
}

# 现在可以像内置函数一样调用子程序:

logger("We have a logger subroutine!");


使用Perl模块

Perl模块提供一系列特性来帮助你避免重新发明轮子CPAN是下载模块的好地方( http://www.cpan.org/ )。Perl发行版本身也包含很多流行的模块。

perlfaq有很多常见问题和相应回答也经常有对优秀CPAN模块的推荐介绍。

深入阅读

- [perl-tutorial](http://perl-tutorial.org/)
- [www.perl.com的learn站点](http://www.perl.org/learn.html)
- [perldoc](http://perldoc.perl.org/)
- 以及 perl 内置的: `perldoc perlintro`