blog/content/post/2008/02/14/2008-02-14-00000800.md

8.0 KiB
Raw Blame History

title author date wordtwit_post_info categories
『新版Perl言語プログラミングレッスン入門編』第六章・繰り返し つづき kazu634 2008-02-14
O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:3731;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}
Perl
Programming

 つづきだよー

mapによる繰り返し

 関数mapは次のような形式で使うよ。

map { 各要素を構成する式 } リスト;

例えばこいつはリストの各要素を二乗したものを返すことになる:

use strict;
use warnings;
my @square = map{ $_ **2 } ( .. 9);
foreach (@square) {
print "$_\n";
}

数字計算だけじゃなくても大丈夫だよ。これもOKだよ。

use strict;
use warnings;
# ユーザー名
my @user =('kazu', 'take', 'yukari', 'nanbu');
# メールアドレスの作成
my @adr = map { $_ . '@gmail.com'} @user;
# 表示
print join("\n", @adr);

パターンマッチの/g修飾子による繰り返し

 パターンマッチの/g修飾子は行全体に渡ってパターンマッチを行う指示ですので、繰り返しの一種と見なすこともできます。例えば

use strict;
use warnings;
# 適当な文字列を作るよ
my $line = '168cm, 58kg, 37 years old';
# 繰り返しがあるかを見るよ
my @match = ($line =~ /[0-9]+/g);
# 表示
print join("\n", @match), "\n";

は変数$lineの中に含まれているすべての文字列を抽出して配列@matchに格納します。

練習問題

問:カレントディレクトリのファイル一覧をソートして表示するプログラム。ただしカレントディレクトリと親ディレクトリは表示させないようにする。

私の回答:

use strict;
use warnings;
# カレントディレクトリを開くよ
opendir (DIR, '.') or die "$!";
# カレントディレクトリのファイル一覧を取得して、配列@flistに格納
my @flist = readdir(DIR);
# 先頭に「.」があるやつを除外すれば大丈夫だろう
@flist = grep (/^[^\.]/, @flist);
foreach (sort(@flist)) {
print join("\n", $_);
}
closedir (DIR);

問: 16進数の表を作ってください。

私の回答:

use strict;
use warnings;
# 16進数の1桁が取りうる範囲
my @range = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
# 16進数表の作成
foreach my $f (@range) {
foreach my $s (@range) {
print "$f$s ";
}
print "\n";
}

こう書いても大丈夫らしい。

my @hex = ('0' .. '9', 'A' .. 'F');

なんか自由だ。