超簡単 Perl一問一答学習帳
はじめに
Perlの初心者が基本的な内容について学習した内容をQ&A方式でまとめてみました。
間違いや最適化などあればご指導よろしくお願い致します。
2.ファイルのバックアップを取って、Perlという文字列をJavascriptに変換するには?
以下をコマンドラインで実行するお!
perl -pi.bak -e 's/Perl/Javascript/g' test.txt
4.インストール済みのCPANモジュールを表示するには?
以下をコマンドラインで実行するお!
perl -MExtUtils::Installed -le 'print join "\n" => sort ExtUtils::Installed->new->modules;'
■処理関連系
1.配列を単純に出力するには?
foreachを利用するお!
#!/usr/bin/perl use strict; use warnings; my @lang = ( 'Perl', 'JAVA', 'Python', 'PHP', 'C++', 'Javascript' ); foeach( @lang ) { print $_; }forでもできるお!
#!/usr/bin/perl use strict; use warnings; my @lang = ( 'Perl', 'JAVA', 'Python', 'PHP', 'C++', 'Javascript' ); for( $i=0; $i<=$#@lang; $i++ ) { print $lang[ $i ]; }
■実行結果
2.連想配列を単純に出力するには?
foreach,keyを利用するお!
#!/usr/bin/perl use strict; use warnings; my %fav = ( 'Perl' => 'love', 'JAVA' => 'hate', 'Python' => 'like', 'PHP' => 'love', 'Javascript' => 'love' ); foreach my $key ( keys %fav ) { print "key: $key value:$fav{ $key }"; } #もしくは以下のように foreach ( sort keys %fav ) { print "key: $_ value:$fav{ $_ }"; }while,eachを使ってもできるお!
#!/usr/bin/perl use strict; use warnings; my %fav = ( 'Perl' => 'love', 'JAVA' => 'hate', 'Python' => 'like', 'PHP' => 'love', 'Javascript' => 'love' ); while( ( $key , $value ) = each( %fav )) { print "key: $key value:$value"; }
■実行結果
key: Python value:like
key: PHP value:love
key: Perl value:love
key: Javascript value:love
key: JAVA value:hate
3.配列の大きさを知るには?
スカラーを利用するか、配列の最終indexに1を足すお!
#!/usr/bin/perl use strict; use warnings; my @data = ( 'Perl', 'Ruby', 'Python' ); #スカラーを利用する my $num = @data; print $num . "\n"; #最後のindexを参照し、1を足す print $#data + 1 . "\n" ;
■実行結果
3
3
4.ファイルの中身を逆から出力するには?
配列のpush,reverseを利用するお!
#!/usr/bin/perl use strict; use warnings; open FH, '<./test.txt' or die; ## 順読み =for foreach my $line( <FH> ) { print $line; } =cut ## 逆読み my @buf; while( <FH> ) { push( @buf, $_ ); } print reverse( @buf );
■実行結果
(ファイルの中身)
Perl
Ruby
JAVA
PHP
Javascript
(出力)
Javascript
PHP
JAVA
Ruby
Perl
5.ファイルの中身から特定の文字を含む行を検索するには?
grepを利用するお!
#!/usr/bin/perl use strict; use warnings; open FH, '<./test.txt' or die; my @buffer = <FH>; #部分一致検索 my @result = grep( /perl/i, @buffer ); #perlという文字を検索します。 #完全一致検索 #my @result = grep( /(^|s)perl($|s)/i, @buffer ); #ラインを表示 foreach my $line(@result) { print $line; }
■実行結果
6.配列を特定の文字列で連結するには?
joinを利用するお!
#!/usr/bin/perl use strict; use warnings; #配列の要素を,で連結し、最後のnodeだけandで結ぶ。 my @lang = ( 'Perl', 'JAVA', 'Python', 'PHP', 'C++', 'Javascript' ); my $last = pop( @lang ); print join( ',', @lang ) . "and $last";
■実行結果
7.配列を文字列の長さで並びかえるには?
配列のsortを利用するお!
#!/usr/bin/perl use strict; use warnings; my @lang = ( 'Perl', 'JAVA', 'Python', 'PHP', 'C++', 'Javascript' ); my @result = sort{ length($a) < length($b) } @lang; foreach( @result ) { print $_ . \n; }
■実行結果
8.アルファベットで降順に並び替えるには?
配列のsortを利用するお! $a, $bを入れ替えると昇順にもできるお!
#!/usr/bin/perl use strict; use warnings; my @lang = ( 'Perl', 'JAVA', 'Python', 'PHP', 'C++', 'Javascript' ); my @result = sort{ $b cmp $a } @lang; foreach( @result ) { print $_ . "\n"; }
■実行結果
9.連想配列の値で重複したデータを取得するには?
grepを利用するお!
#!/usr/bin/perl use strict; use warnings; my %fav = ( 'Perl' => 'love', 'JAVA' => 'hate', 'Python' => 'like', 'PHP' => 'love', 'Javascript' => 'love' ); my @values = values( %fav ); my %count; my @list = grep{ $count{$_} ++ } @values; while( ($key, $value ) = each( %count ) ) { if( $value > 2 ) { print "key : $key value : $value \n"; } }
■実行結果
key : love value : 3
10.2つの連想配列のkeyの和集合、差集合を求めるには?
連想配列を利用するお!
#!/usr/bin/perl use strict; use warnings; my %data_1 = ( 'name' => 'Yuta', 'age' => '27', 'tel' => '000-0000-0000', 'addr' => 'Yokohama' ); my %data_2 = ( 'name' => 'Kikuchi', 'addr' => 'Niigata', 'fav' => 'programming'); my %union; my %intersect; foreach my $value( keys( %data_1 ), keys( %data_2 ) ) { $union{ $value }++ && $intersect{ $value }++; } #和集合 foreach( keys %union ) { print $_ . "\n"; } #差集合 foreach( keys %intersect ) { print $_ . "\n"; }
■実行結果
union
tel
fav
name
age
addrintersect
name
addr
11.サブルーチンを使ってfizzbuzを解くには?
関数を再帰的に利用するお!
#!/usr/bin/perl use strict; use warnings; sub fizzbuz { my $value = shift; if( $value > 1 ) { &fizzbuz( $value -1 ); } if( $value % 15 == 0 ) { print "$value = fizzbuz\n"; } elsif ( $value % 3 == 0 ) { print "$value = fizz\n"; } elsif ( $value % 5 == 0 ) { print "$value = buzz\n"; } } &fizzbuz( 15 );
■実行結果
3 = fizz
5 = buzz
6 = fizz
9 = fizz
10 = buzz
12 = fizz
15 = fizzbuz
■クラス/CPAN系
1.クラスを継承させるには?
@ISAを利用するお!
#!/usr/bin/perl -w use strict; use warnings; # 親クラスの定義 package Parent; sub new { my ( $class, $name, $age ) = @_; my $self = { name =>$name, age=>$age } ; return bless $self,$class; } sub echo { my $self = shift; return "My name is " . $self->{name} . " I am " . $self->{age} . " years old ."; } #子クラスの定義 package Child; our @ISA=qw/Parent/; sub call { my $self = shift; return $self->{name} . " is calling."; } #mainプログラム package main; my $child = Child->new( 'Kikuchi', '27' ); print $child->call() . "\n"; print $child->echo() . "\n";
■実行結果
Kikuchi is calling.
My name is Kikuchi I am 27 years old .
2.APIからXMLを取得してパース、出力するには?
LWP::SImple,XML::Simpleを利用するお!
#!/usr/bin/perl use strict; use warnings; use strict; use LWP::Simple; use XML::Simple; use Data::Dumper; use URI::Escape; use JSON::Syck; my $appid = '*********'; my $api = "http://news.yahooapis.jp/NewsWebService/V2/topics?appid=$appid&topicn ame=weather"; my $document = LWP::Simple::get($api) or die "cannot get content from $api"; my $parser = XML::Simple->new; #XMLをパースする my $data = $parser->XMLin($document); #JSONで出力する warn Dumper( JSON::Syck::Dump( $data->{Result} ) );
■実行結果
$VAR1 = '{"SubCategory":{"Sub":"気象と災害"},"HeadlineUpdateTime":"2011-01-07T14:03:18","DateTime":"2011-01-09T11:20:11","HeadlineId":{},"SmartphoneUrl":"http://dailynews.yahoo.co.jp/iphone/domestic/weather/","PvIndex":"0","TopicName":"天気概況","Title":{},"Keyword":{},"Overview":"気象や天気予報、天候被害について。しん気楼など珍しい自然現象に関するニュースも。","English":"weather","PickupOrder":{},"NewsUpdateTime":"2011-01-09T11:20:11","NewsNum":"62","CreateTime":"2008-07-02T22:35:03","RelatedInfoUpdateTime":"2010-11-11T15:10:41","NewsUrl":"http://dailynews.yahoo.co.jp/fc/domestic/weather/news_list/?pn=1","RelatedInformation":{},"EditNum":"125","Url":"http://dailynews.yahoo.co.jp/fc/domestic/weather/","PickupCategory":{},"Category":"国内"}';