欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Perl 基本语法 - 列表和数组

最编程 2024-03-15 13:25:00
...
#!/usr/bin/env perl -w

$fred[0] = "yabba";
$fred[1] = "dabba";
$fred[2] = "doo";

print @fred;
#print @fred."\n";

qw 简写

qw ! fred barney betty wilma dino !
qw#  fred barney betty wilma dino # #有些像注释
qw(   fred barney betty wilma dino )
...

列表赋值

($fred, $barney, $dino) = ("flintstone", "rubble", undef);
($fred, $barney) = qw <flintstone rubble slate granite>; #两个值被忽略了
($rocks[0],$rocks[1],$rocks[2],$rocks[3]) = qw/talc mica feldspar quartz/;

当想引用这个数组时, Perl 有一种简单的写法。在数组名前加@(后没有中括号) 来引用整个数组。 你可以把他读作 "all of the "(所有的)”,所以@rocks 可以 读作 "all of the rocks(所有的石头)"。其在赋值运算符左右均有效:

@rocks = qw / bedrock slate lava /;
@tiny = ();                         #空表
@giant = 1..1e5;               #包含 100,000 个元素的表
@stuff = (@giant, undef, @giant);      #包含 200,001 个元素的表
@dino = "granite";
@quarry = (@rocks, "crushed rock", @tiny, $dino);

pop 和 push 操作

@array = 5..9;
$fred = pop(@array);      #$fred 得到 9,@array 现在为(5,6,7,8)
$barney = pop @array;   #$barney gets 8, @array 现在为(5,6,7)
pop @array;                   #@array 现在为(5,6)(7 被丢弃了)
push(@array,0);                   #@array 现在为(5,6,0)
push @array,8;                    #@array 现在为(5,6,0,8)
push @array,1..10;              #@array 现在多了 10 个元素
@others =qw/9 0 2 1 0 /;
push @array,@others;          #@array 现在又多了 5 个元素(共有 19 个)

shift 和 unshift 操作

push 和 pop 对数组的末尾进行操作(或者说数组右边有最大下标的元素,这依赖 于你是怎样思考的)。相应的, unshift 和 shift 对一个数组的开头进行操作(数 组的左端有最小下标的元素) 。下面是一些例子:

@array = qw# dino fred barney #;
$m = shift (@array);       #$m 得到 "dino", @array 现在为 ("fred", "barney")
$n = shift @array;          #$n 得到 "fred", @array 现在为 ("barney")
shift @array;                  #@array 现在为空
$o = shift @array;          #$o 得到 undef, @arry 仍为空
unshift(@array,5);          #@array 现在为(5)
unshift @array,4;           #@array 现在为(4,5)
@others = 1..3;
unshift @array, @others;  #array 现在为(1,2,3,4,5)

和 pop 类似,如果其数组变量为空,则返回 undef。

字符串中引用数组

和标量类似,数组也可以插入双引号的字符串中。插入的数组元素会自动由空格分 开:

@rocks = qw{ flintstone slate rubble };
print "quartz @rocks limestone\n";        #输出为 5 种 rocks 由空格分开

foreach 控制结构

foreach $rock (qw/ bedrock slate lava /) {
      print "One rock is $rock.\n" ;           #打印出 3 种 rocks
}

这里的$rock不是这些列表元素中的一个拷贝而是这些元素本身

最常用的默认变量 : $_

如果在 foreach 循环中省略了控制变量,那 Perl 会使用其默认的变量:$_。除了 其不寻常的名字外,这和普通变量类似,如下面代码所示:

foreach(1..10){                 #使用默认的变量$_
    print "I can count to $_!\n";
}
$_ = "Yabba dabba doo\n";
print;                                      # 打印出默认变量 $_

reverse 操作

reverse(逆转)操作将输入的一串列表(可能是数组)按相反的顺序返回。

@fred = 6 .. 10;
@barney = reverse (@fred);  #得到 10,9,8,7,6
@wilma = reverse 6 . .10;   #同上,没有使用额外的数组
@fred = reverse @fred;     #将逆转过的字符串存回去

sort 操作

@rocks = qw/ bedrock slate rubble granite /;
@sorted = sort(@rocks);                      #得到 bedrock, granite, rubble, slate

标量和列表上下文

42 + something               #something 必须是标量
sort something                #something 必须是列表
@people = qw( fred barney betty );
@sorted = sort @people;            #列表内容: barney , betty, fred
$number = 42 + @people;            #标量内容:42+3,得到 45

另一个例子是 reverse。在列表 context 中,它返回反转的列表。在标量 context 中,返回反转的字符串(或者将反转的结果串成一个字符串):

@backwards = reverse qw / yabba dabba doo /;
#返回 doo, dabba, yabba
$backwards = reverse qw/ yabba  dabba doo /;
#返回 oodabbadabbay

在列表 Context 中使用 Scalar-Producing 表达式

如果一个表达式不是列表值,则标量值自动转换为一个元素的列表:

@fred = 6*7;
@barney = "hello" . '' . "world";

强制转换为标量 Context

偶尔,你可能需要标量 context 而 Perl 期望的是列表。这种情况下,可以使用函数 scalar。它不是一个真实的函数因为其仅是告诉 Perl 提供一个标量 context:

@rocks = qw(talc quartz jade obsidian);
print "How many rocks do you have?\n;
print "I have " @rocks, "rocks!\n";    # 错误,输出 rocks 的名字
print "I have " scalar @rocks, "rocks!\n;    # 正确,输出其数字

<STDIN> 在列表 Context 中

@lines = <STDIN>; #将输入读入列表 context 中
chomp (@lines = <STDIN>); #读入所有的行,不包括换行符