Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

超簡単 Perl一問一答学習帳

はじめに

Perlの初心者が基本的な内容について学習した内容をQ&A方式でまとめてみました。
間違いや最適化などあればご指導よろしくお願い致します。

目次

  1. コマンドライン
    1. コマンドラインでプログラムを実行するには?
    2. ファイルのバックアップを取って、文字列を置換するには?
    3. CPANモジュールをinstallするには?
    4. インストール済みのCPANモジュールを表示するには?
  2. 処理関連系
    1. 配列を単純に出力するには?
    2. 連想配列を単純に出力するには?
    3. 配列の大きさを知るには?
    4. ファイルの中身を逆から出力するには?
    5. ファイルの中身から特定の文字を含む行を検索するには?
    6. 配列を特定の文字列で連結するには?
    7. 配列を文字列の長さで並びかえるには?
    8. アルファベットで降順に並び替えるには?
    9. 連想配列の値で重複したデータを取得するには?
    10. サブルーチンを使ってfizzbuzを解くには?
  3. クラス/CPAN
    1. クラスを継承させるには?
    2. APIからXMLを取得してパース、出力するには?

コマンドライン

1.コマンドラインでプログラムを実行するには?

以下をコマンドラインで実行するお!

perl -e 'for( $i=0; $i<=10; $i++ ) { print "hoge \n"; }'

2.ファイルのバックアップを取って、Perlという文字列をJavascriptに変換するには?

以下をコマンドラインで実行するお!

perl -pi.bak -e 's/Perl/Javascript/g' test.txt

3.CPANモジュールをinstallするには?

以下をコマンドラインで実行するお!

sudo perl -MCPAN -e shell
cpan[1]> install JSON

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 ];
}

■実行結果

Perl
JAVA
Python
PHP
C++
Javascript

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;
}

■実行結果

Perl

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";

■実行結果

Perl,JAVA,Python,PHP,C++ and Javascript

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;
}

■実行結果

Javascript
Python
Perl
JAVA
PHP
C++

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";
}

■実行結果

Python
Perl
PHP
Javascript
JAVA
C++

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
addr

intersect
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":"国内"}';