神戸の玉手箱

写真とプログラムのブログです。

Perl 本文解説

2017年01月24日 | パール2

1.Perlプログラムの実行方法

   ・Dosプロンプトでperlに続けてプログラム名を書く
      perl C:\perl\abcd.pl
   ・又は事前にcdコマンドでディレクトリを移動しておく
      cd C:\perl
      perl abcd.pl
   ・Linuxサーバでの実行方法
      ファイル属性を754に設定
        $ chmod 754 abcd.pl
      perlにパスが通っていれば
        $ ./abcd.pl
      そうでない時は
        $ perl abcd.pl

2.Perlプログラムを実行前にチェックする方法

    事前にcdコマンドでディレクトリを移動しておいてから以下を実施
      perl -wc abcd.pl
      abcd.pl syntax OK
    上のsyntax OKが出れば文法エラーはない

3.Perlコマンドラインオプション

   ■-c オプション
      -c オプションを利用すると、Perl プログラムを実際には実行せずに、構文チェックだけを行うことができます
      (BEGIN、END ブロックと use は実行されるようです)。
   ■-e オプション
      -e オプションは、指定された文字列をプログラムとして実行し、すぐに Perl を終了するオプションです。

        perl -e 'print "Perl 大好き!"'

      として実行すれば、画面に Perl 大好き! が出力されます。
      このオプションを指定した場合は、perl コマンドの引数としてプログラムを指定することはできません。
      これ単体ではあまり大した価値はないのですが、後に紹介するオプションと組み合わせて利用します。
   ■-i オプション
      例えば、HTML ファイルが 100 コあるとします。
      そのなかで、ある要素の color 属性値に #ffffdd という色を指定していたとします。
      しかし、すべてを #aaaacc に色変更したい、といった要望があったとします。
      そういう場合に、すべてエディタで置換するのは大変です。そこで、

        perl -i.bak -p -e 's/#ffffdd/#aaaacc/ig;' *.html

      とすると、オリジナルファイルが .bak という拡張子をつけてバックアップとしてコピーされ、
      オリジナルファイルの #ffffdd が #aaaacc に置換されます。
      上記のようにワイルドカード(*)で指定すれば、100 個のファイルすべてを一気に置換することができます。
      便利ですよね?
      なお、-i オプションの後ろの拡張子を指定しない場合は、バックアップファイルは作成されません。
   ■-p オプション
      ループブロックの内側の最後に print $_; があるように振舞います。
      つまり、こんな感じです(実際に等価な処理は少し違います)。

        while(<>) {
          ....
          print $_;
        }

      例えば、

        perl -p -e 'print ++$i, ": "' /etc/hosts

      とすれば、/etc/hosts に行番号をつけて出力することができます。
   ■-v オプション
      perl のバージョンとパッチレベルを出力する。

        perl -v
        This is perl, v5.8.9 built for MSWin32-x86-multi-thread
        (with 12 registered patches, see perl -V for more detail)

        Copyright 1987-2008, Larry Wall

        Binary build 826 [290470] provided by ActiveState http://www.ActiveState.com
        Built May 24 2009 09:21:05

        Perl may be copied only under the terms of either the Artistic License or the
        GNU General Public License, which may be found in the Perl 5 source kit.

        Complete documentation for Perl, including FAQ lists, should be found on
        this system using "man perl" or "perldoc perl". If you have access to the
        Internet, point your browser at http://www.perl.org/, the Perl Home Page.
   ■-w オプション
      -w オプションを利用すると、一度しか出現しない識別子や、初期化されずに参照される変数など、
      危険、無駄と思われる処理の警告を出力します。
      実際にはもっとたくさんの種類のチェックをするようです。

        perl -wc abcd.pl

4.Perlの場所を探す方法

    サーバで次のコマンドを叩く

    # which perl
    /usr/bin/perl

5.Perlプログラムのデバッグ方法

    perl -d abcd.pl
     n           # でNext. 次の文の始めまで、サブルーチンに入らずに実行する
                 # (注意)普通のデバッグならデバッグモードで起動後は必ず直ぐにnを入力する
     p 変数名      # で変数の内容表示
     c           # 今いる所から最後まで実行する
     c 数字       # 今いる所から数字で指定された行まで実行する
     q           # デバッグモードを終了する
     h           # ヘルプ
     !数字        # 過去のコマンド実行
     H           # ヒストリ (↑キーで一つ前の呼び出し)
     b[行番号][条件] # ブレークポイントを設定する。条件が設定された場合、ブレークポイントの行を
                 # 実行する直前に条件が真の場合だけブレークされる。

    ★デバッグモードになった後、変数初期化を書いた部分を過ぎるまでリターンキーを押して下さい。
     そうしないと、不都合な事が起こります。
    簡単なデバックは、ファイルに書かなくても出来ます。
      perl -d だけで起動し、n エンター CTRL+c を押します。
      画面にDB<1>と表示されたら、チェックしたいプログラムを張り付け p コマンドで変数、配列の内容を確認出来ます。

6.カレントディレクトリの取得方法

    使用する時は、下記のモジュールをインクルードする。
      use Cwd;
    フォルダ名+ファイル名を変数$filenameに代入する例
      use Cwd;
      # カレントディレクトリを変数$wdに取得
      $wd = Cwd::getcwd();
      配列 @sname に沢山のログファイル名が入っており、0番の要素から順番にフォルダ名+ファイル名を変数に作って行く
      @sname = (aaa.log, bbb.log, ccc.log, ddd.log);
      # 変数初期化
      $i = 0;
      # 処理を繰り返す
      foreach (@sname) {
        $filename = $wd."/".$sname[$i];
        # 色々な処理プログラムを書く
        $i++;
      }

7.ダブルクォーテーションとシングルクォーテーションの違い

    変数をダブルクォーテーションでくくると、変数に設定されている文字を表示します。
      $a = "Hello";
      print "$a World";  # 実行結果 → Hello World

    変数をシングルクォーテーションでくくると、変数文字自体を表示します。
      print '$a World';  # 実行結果 → $a World

8.複数行をコメントアウトする方法

    @data = (1, 2); # テスト用のデータ
    =pod # ここからコメント
    @data = ();
    while ($line = <>;) { # ファイルからデータを読み込む
      chomp $line;
      ($x, $y) = split /\s+/, $line;
      push @data, ($x + $y);
    }
    =cut # ここまでコメント
    foreach $data (@data) {
      print $data, "\n";
      # $data を使っていろいろな処理.
    }
    =podと=cutは、行頭から書いて下さい

9.グローバル変数とローカル変数

    { }の外で宣言したmy $globalは、グローバル変数でプログラムの何処からでも参照できますが
    { }の中で宣言したmy $localは、{ }で囲まれた中でしか参照出来ない為、$localの内容は表示出来ません。
    my $global = "むかしむかし、あるところに";  # グローバル変数
    &to;  # サブルーチンへ
    print "$global、$local\n";
    sub to {
      my $local = "おじいさんと、おばあさんがすんでいました。";  # ローカル変数
    }
    上のプログラムの実行結果は、下のようになります。
    Name "main::local" used only once: possible typo at test.pl line 6.
    Use of uninitialized value in concatenation (.) or string at test.pl line 6.
    むかしむかし、あるところに、

10.スカラー変数、配列、連想配列、定数

    ■スカラー変数($XXX)
      ダラー( $ )で始まる変数はスカラー変数と呼ばれます。
      スカラー変数には数値や文字列をひとつだけ代入することができます。
      通常、何も初期化していない変数はヌルまたは0として扱われますが、perlの処理系によっては(バグなのか?)
      ゴミの値になることがあるようですので、最初に $xx = 0; と初期化しておいた方が無難なようです。
      プログラムの最初に変数の宣言をしておくと良いでしょう。
        #変数初期化
        my $Ver = "2016/08/09 Ver5.13";    #プログラムバージョン
        my $p = "";              #パス
        my $prog = "";            #実行プログラム名
        my $i = 0;              #forループカウンタ
        my $j = 0;              #forループカウンタ
        #perlスクリプトのコマンド名をパス、プログラム名に分離しプログラム名を取得する
        ($p, $prog) = split(/\//, $0);

    ■配列(@XXX)
      アットマーク( @ )で始まるのは配列です。
      複数の数値や文字列を代入することができます。混在も可能です。
      $変数名[添え字]という形式で配列を表現することができます。添え字は0から始まります。
      添え字には 0,1,2,3...n を指定します。
      $aaa[0],$aaa[1],$aaa[2],....$aaa[n]
      配列の初期化は次のようにします。多次配列の時も同じです。
      my @aaa = ();

    ■連想配列(%XXX)
      パーセント( % )で始まるのは連想配列です。
      $変数名{文字列}という形式で、文字列を添え字とした配列を表現することができます。
      $car{"プリウス"} = "トヨタ";
      $car{"フィット"} = "ホンダ";
      %変数名 という形式で、連想配列全体を表現することができます。
      次の例では、$car{"プリウス"} という変数に "トヨタ" が、$car{"フィット"} という変数に "ホンダ" が代入されます。
        %car = ( "プリウス", "トヨタ",
            "フィット", "ホンダ"
            );
        print $car{"プリウス"}, "\n";  # トヨタ
        print $car{"フィット"}, "\n";  # ホンダ
      すべての連想配列要素について処理を行うには次のようにします。
        while (($name, $value) = each(%car)) {
          print "$name = $value\n";
        }
      実行結果
        # プリウス = トヨタ
        # フィット = ホンダ

    ■定数
      定数とは、値が固定されて変化しない数のことです。
      constantプラグマを使うと定数宣言ができます。
        use constant HANDVALUE_GUU =>; 0;
        use constant HANDVALUE_CHO =>; '1';
        use constant BUFLEN =>; 10_000;

    ■変数や配列だけのファイルを作る時の注意点
      変数や配列だけのファイルを作る時は、次の様にします。
      このようにしなければならないと言う事では有りません。
      あくまでも見易さです。
      最後の1;は、エラー回避の為で、真の時trueを返す目的であって慣例として1;を書きます。
        #! /usr/bin/perl -w
        #
        %car = (
          "プリウス","トヨタ",
          "フィット","ホンダ",
          "ワゴンR","スズキ",
          "ミラ","ダイハツ"
        );
        1;

11.関数色々

  ①大文字を小文字に変換。(lc)(tr)
    $a = 'Abcd';
    $a = lc $a;

    とやると、$a には "abcd" が入ります。

    trコマンドでも同じ事が出来ます。
    $a =~ tr/A-Z/a-z/;

  ②小文字を大文字に変換。(uc)(tr)
    また反対に、小文字を大文字に変換したいときは、

    $a = 'Abcd';
    $a = uc $a;

    とやると、$a には "ABCD" が入ります。

    trコマンドでも同じ事が出来ます。
    $a =~ tr/a-z/A-Z/;

  ③文字列から指定した部分を取り出す/置換する(substr)
    ● 使用例
      $date = 'ABCDEFGHIJKLMN';
      $kaku = substr($date,5,3);
        $kaku に"FGH"が代入される
        数字5は0勘定で、5番目から3こ取り出す

      $kaku = substr($date,5);
        $kaku に"FGHIJKLMN"が代入される
        長さを省略した時には文字列の末尾までを返す。

      $kaku = substr($date,-5,-2);
        $kaku に"JKL"が代入される
        開始位置が文字列の末尾5文字目から、文字列の末尾2文字を残す。

      $kaku = substr($date,-3,3);
        $kaku に"LMN"が代入される
        文字列の最後から3文字を取出す。

    ● substrは文字列を取り出すだけでなく、挿入したり置き換えたりすることもできる。
      $date = 'ABCDEFGHIJKLMN';
      substr($date,0,0,"123");
      substr($date,0,0) = "123";
        どちらの書き方でも$date の先頭に"123"が挿入され"123ABCDEFGHIJKLMN"となる
        $dateの先頭(0)の長さを0文字と、文字列123を置き換える。

      substr($date,3,5,"456");
        $date の"DEFGH"を"456"に置き換え"ABC456IJKLMN"となる
        上は開始位置は3(D)、長さは5文字なのでDEFGHを指す。

      substr($date,3,-5,"789");
        $date の"DEFGHI"を"789"に置き換え"ABC789JKLMN"となる
        上は開始位置は3(D)、長さは-5文字なのでJKLMNを指す。
        開始位置は3で、文末から5文字を残して置き換えている。

      $suの一文字目を取出す
        $su = "02";
        $one = substr($su,0,1);
        結果0

      $suの二文字目を取出す
        $su = "02";
        $one = substr($su,1,1);
        結果2

    ● 変数の最後の文字を確認する例
      print "フォルダ名を入力して下さい ->; ";
      chomp($current_dir = <STDIN>);
      # 最後の文字列が"\"か調べて違う時"\"を追加する
      if (substr($current_dir,-1,1) ne "\\") {
        $current_dir = $current_dir."\\";
      }

  ④変数内の改行を削除する。(chomp)
    キーボードから文字を入力するには<STDIN>を使用しますが、入力終了時にEnterをするため文字の
    最後に改行が入力されてしまいます。この改行を削除する為にchompを使います。
      chomp($host = <STDIN>);

    変数内の改行を削除する
      chomp($vvv);

  ⑤リスト(配列)操作関数(split)
    split は最も良く使う関数の一つでしょう。
    文字列を指定したセパレータ(デリミタ、区切り文字)で分割し、リストに格納するという関数です。

    配列$list[0] の内容が "Hideo 171.5  65.0" であった時、それぞれを変数に代入するには
      ($name, $height, $weight) = split(/\s+/, $list[0]);
        実行結果は下のようになる
        $name = "Hideo"
        $height = 171.5
        $weight = 65.0

    配列$list1[0]の要素を空白で区切って配列@list2に代入する
      $list1[0] = "Hideo 171.5  65.0" の時
      @list2 = split(/\s+/,$list1[0]);
        実行結果は下のようになる
        $list2[0] = "Hideo"
        $list2[1] = 171.5
        $list2[2] = 65.0

    出力結果を変数に取り込む(区切り文字は複数の空白)
      区切り文字しか書いていない時は、暗黙の了解で直前の処理結果です。
      ($name,$height,$weight) = split (/\s+/);
        実行結果は下のようになる
        $name = "Hideo"
        $height = 171.5
        $weight = 65.0

      変数が内容よりも少ない時は、後ろの要素が破棄される。
      ($name,$height) = split (/\s+/);
        実行結果は下のようになる
        $name = "Hideo"
        $height = 171.5

    出力結果を変数に取り込む(区切り文字は',')
      ($vrf,$int) = split(/,/);

    出力結果を変数に取り込む(区切り文字は複数の空白)
      ($prot,$add,$age,$hardadd,$type,$int) = split (/\s+/);

    複数の要素から1つを選んで取り込む
      split(/\s+/,$work)全体を括弧でくくることにより後方参照出来るようになり、
      どの項目を参照するかは、[ ]でくくった数字で指定します。
      数字は0勘定で指定し、数字の順番を変える事により取込む順番を変更できます。
      下の例は、Interfaceを指定したものです。
                Address    Age     HardwareAddr State    Type  Interface
      my $work = "192.168.1.5  00:33:40  1222.bd58.7cc2 Dynamic  ARPA GigabitEthernet0/0/0/0.203";
      $int = (split(/\s+/,$work))[5];
      pritn "$int\n";
        実行結果は下のようになる
        GigabitEthernet0/0/0/0.203

    複数の要素から2つを選び、順番を変えて取り込む
      下の例は、Address Age Hardware_Addr State Type Interface の6つの要素から
      5番目のInterfaceと0番目のAddressを指定した例です。
        ($int,$add) = (split(/\s+/,$work))[5,0];
        pritn "$int\n";
        print "$add\n";
          実行結果は下のようになる
          GigabitEthernet0/0/0/0.203
          192.168.1.5

      配列にも代入出来ます。
      @list = (split(/\s+/,$work))[5,0];
      pritn "$list[0]\n";
      print "$list[1]\n";
        実行結果は下のようになる
        GigabitEthernet0/0/0/0.203
        192.168.1.5

    区切り文字の指定が無い時は暗黙の了解で空白
      @list1 = split;

    改行で分割し配列に格納する
      my @content = split(/\n/,$content);

    /で区切られた文字列を分離するには
      $in_filename = "/var/www/mrtg/node/YYEROUT1/yyerout1_gigabitethernet2_26.log";

      @log = split(/\// , $in_filename);
        実行結果は下のようになる
        $log[0] = "var"
        $log[1] = "www"
        $log[2] = "mrtg"
        $log[3] = "node"
        $log[4] = "YYEROUT1"
        $log[5] = "yyerout1_gigabitethernet2_26.log"

    $list[0]内にある文字列bootを含んだ単語を抽出するには、split関数で行う
      $list[0]の内容がSystem image file is "bootdisk:s72033-adventerprisek9_wan-mz.122-33.SRA6.bin"の時

      @list3 = split(/ /,$list[0]);
        実行結果は下のようになる
        $list3[0] = System
        $list3[1] = image
        $list3[2] = file
        $list3[3] = is
        $list3[4] = "bootdisk:s72033-adventerprisek9_wan-mz.122-33.SRA6.bin"

  ⑥文字数をカウント(length)
    月が1桁か調べる
    $tuki = $filename[1];
    if (length($tuki) == 1) {
      # 0を追加 "1"→"01"
      $tuki = "0".$tuki;
    }

  ⑦特定の文字列を間に挟む文字列の連結(join)
    join ('区切り文字',連結したい配列や文字)

      区切り文字をアンダーバーにした例
        $aa = "yyerout1";
        $bb = "gigabitethernet1";
        $cc = "0";
        $dd = "0.html";
        $path = join ("_",$aa,$bb,$cc,$dd);
        print $path;
        実行結果は下のようになる
        yyerout1_gigabitethernet1_0_0.html

  ⑧カレントディレクトリの変更(chdir)
    chdir '/home/user1' or die $!;

    or die $! は、エラーが起きた時の処理

12.置換演算子 s///

  s/パターン/置換文字列/スイッチ 「パターン」にマッチする文字列を「置換文字列」に置き換える
  ただし s/// よりも tr/// の方が高速です。
    オプションスイッチ一覧
    e:/置換文字列/の部分を文字列ではなく、perlの実行文と解釈して、その結果に置換します。
    g:見つかったすべてのパターンを置換します。
    i:大文字、小文字を区別しない
    o:変数展開を1度だけ行う
    m:文字列を複数行として扱う
    s:文字列を単一行として扱う
    x:拡張正規表現を行う

  ★例1:置換文字列のところに計算式を書くこともできます.
    hh:mm:ss 形式の時刻データを、すべて夜中の0時からの経過秒に置換してみましょう.
    $line = "started 07:32:02 arrived 12:01:23";
    $line =~ s/(\d\d):(\d\d):(\d\d)/($1 * 3600 + $2 * 60 + $3)/eg;
    print $line."\n";
    又は次の式でも同じ結果になります。
    $line =~ s/(\d+):(\d+):(\d+)/($1 * 3600 + $2 * 60 + $3)/eg;
    print $line."\n";
    出力はこうなります.
    started 27122 arrived 43283

  ★例2:置換文字列のところに関数だって書けます.
    たとえば sprintf を使えば,文字列中に含まれる小数点付きの数値をすべて小数点以下3ケタ表示
    にするなんて事ができます.
    $line = "4.725 + 3.2 + 0.075 = 8.0";
    $line =~ s/(\d+\.\d+)/sprintf("%.3f", $1)/eg;
    print $line."\n";
    出力はこうなります.
    4.725 + 3.200 + 0.075 = 8.000

  ★例3:文字列の両端にあるスペースを削除する(Trim)
    $string =~ s/^\s+(.*?)\s+$/$1/;
    まずは、\sは、文字クラス[ \t\n\r\f](左端にスペース含む)と同義です。
    始めに、文字列の先頭から\sの1回の連続にマッチさせる。
    つぎに、任意1文字の0回の連続に最小マッチさせて、これを$1に記憶する。
    そして、\sの1回の連続を後尾までマッチさせる。
    最後に、文字列全体を$1で置換する。
    
    又は、下記のように2回に分けて実行しても良い
    $string =~ s/^\s+//; # 先頭の空白削除
    $string =~ s/\s+$//; # 末尾の空白削除
    
    \s は、(スペース、タブ、改行)を含むので末尾のスペースだけを削除したい場合は次の様にします。
    $string =~ s/ +$//;

  ★例4:置換演算子の内容で置き換える
    $name =~ s/\W.*//;
    =~ は、左の変数 $name 内を検索し、右の置換演算子の内容で置き換える事を表します。
    s:置換演算子
    \W:単語を構成しない文字
    .*:行末までの文字全て
    //:空白に変換

  ★スラッシュ( / )以外の区切り文字を使う事が出来ます。
    # |を使った例
    $path =~ s|/usr/bin|/usr/local/bin|;
    
    # カッコ類も可
    $path =~ s(/usr/bin)(/usr/local/bin);

  ★その他の例
    GigabitEthernetをGiに置換
      $int = "GigabitEthernet2/3";
      $int =~ s/GigabitEthernet/Gi/;
      print $int,"\n";
      実行結果は下のようになる
      Gi2/3
    
    ,を削除
      $count =~ s/,//;
    
    文字列の最後に有る":"を削除
      $list[9] =~ s/:$//;
    
    行の先頭の空白を削除(空白だけの行は無くなる)
      s/^(?:\s|\x20)+//o;
        ^ 行の先頭の
        (?:....) 後方参照を行わないグループ化
        (this|that) thisかthatのいずれか1つ
        \s \x20 どちらも空白を表す
        + 1個以上の

13.変換演算子 tr///

  tr/SEARCH/REPLACE/ 演算子は検索文字列 SEARCH に含まれる各文字を、置換文字列 REPLACE にマッチする文字に
  1文字ずつ変換します。
  REPLACE を省略すると、マッチした文字は削除されます。この関数は変換、もしくは削除した文字数を返します。
  置換文字列が検索文字列より短い場合、対応する文字がない時は置換文字列中の最後の文字に置き換えられます。
  s/// 演算子より高速です。

  オプションスイッチ一覧
    c:検索リストに指定された文字以外を検索
      つまり、最初に指定する文字列に含まれていない文字を置換文字列の文字に変換します。
    d:置換されなかった文字を削除
    s:置換後の文字が重複している場合は削除して1つにつめる

  ★例1:小文字に正規化
    $wd = 'GOOOOD@ABCD.CO.JP';
    $wd =~ tr/A-Z/a-z/;
    print $wd,"\n";
    実行結果は下のようになる
    gooood@abcd.co.jp

  ★例2:$wd に含まれる . の数を数える
    $count = 0;
    $wd = 'GOOOOD@ABCD.CO.JP';
    $count = $wd =~ tr/././;
    print $count,"\n";
    実行結果は下のようになる
    2

  ★例3:英字以外をスペースに変換
    $wd = 'gooood@abcd.co.jp';
    $wd =~ tr/a-zA-Z/ /cs;
    print $wd,"\n";
    実行結果は下のようになる
    gooood abcd co jp

  ★例4:連続した単語をひとつにまとめる
    $wd = 'gooood@abcd.co.jp';
    $wd =~ tr/a-zA-Z//s;
    print $wd,"\n";
    実行結果は下のようになる
    god abcd co jp

14.文字操作色々

  ここでの操作は、正規表現で使われるメタキャラクタを使用しているので
  「25.メタキャラクタ」を参照すると分かりやすい。
  
  ★ vrf名のアルファベットのみを取出す(数字を削除)
    $vrf = "vpn21";
    $vrf =~ s/\d+//;
    print $vrf,"\n";
    実行結果
    vpn
  
  ★ vrf名の数字のみを取出す(文字列を削除)
    $vrf4 = "vpn21";
    $vrf4 =~ s/^\D+//;
    print $vrf4,"\n";
    実行結果
    21
  
  ★ 数字を取出し配列に格納する
    $suji = "IMG_00789.JPG";
    @cnt = $suji =~ /\d+/g;
    print $cnt[0],"\n";
    実行結果
    00789
  
  ★ ^Cを^に置換する
    処理対象は暗黙の了解で直前の処理結果です。
    s/\^C+/\^/g;
  
  ★ 先頭の複数の空白削除
    処理対象は暗黙の了解で直前の処理結果です。
    s/^\s+//;
  
  ★ 行末の複数の空白削除
    処理対象は暗黙の了解で直前の処理結果です。
    どちらも同じ結果になります。
    s/ +$//;   # 複数の空白
    s/\s+$//;   # 複数のスペース、タブ、改行
  
  ★ [^] とすると行頭の任意の1文字。
    [ ] の中の1文字目が ^ の場合は、行頭の文字が [ ] の中の文字以外という意味。
    [^abc] と書くと、行頭が abc 以外の任意の1文字。
    
  ★ [^^] とすると行頭以外の任意の1文字。
    [^^]hideo 行頭以外の hideo を検索する
    
  ★ [^$] と書くと、行末以外の任意の1文字
    [^$]hideo 行末以外の hideo を検索する
    
  ★ 変数の内容を入れ替える
    ($a, $b) = ($b, $a);
  
  ★ 文字どおしを接続する時は、.(ピリオド)を使います。
    print "私は"."山田太郎です。\n";
    実行結果
    私は山田太郎です。
  
  ★ 文字列を反転させる
    $aa = "abcd";
    $bb = reverse $aa;
    print $bb,"\n";
    実行結果
    dcba
  
  ★ 文字の整形(sprintf)
    
    ①年月日の整形例
      $date = "2016/8/8";
      ($y,$m,$d) = split (/\//,$date);        # 変数 $date を、/で年月日に分割
      $work = sprintf("%04d/%02d/%02d",$y,$m,$d);  # 書式設定
      print $work;
      出力はこうなります
      2016/08/08
      
    ②符号付整数例
      $data = -1;
      print sprintf("%+d",$data);
      実行結果
      -1
      
      $data = 2;
      print sprintf("%+d",$data);
      実行結果
      +2
      
    ③修飾子
      %-nd   # 左寄せで表示 n は文字列の長さ
      #    # 8進の整数は 0 で始まり、16進の整数は 0x で始まるように表示
      %nd   # 数値変数の10進展開 n は文字列の長文字数が足りない場合はスペースで埋める
      %n.mf  # 小数点付き数値の10進展開 n は文字列の長さ、m は少数点以下の桁数を指定
      %+d   # 符号付き10進展開符号 + または - をつけて表示
      %0nd   # 文字数が足りない場合は 0 で埋める n は文字列の長さ
      
    ④フォーマット指定子
      %c   # 文字 -Character
      %d   # 10進数 -Deximal
      %e   # 浮動少数(指数形式) -Exponential
      %E   # 浮動少数(大文字のEを使った指数形式)
      %f   # 浮動小数(固定小数点形式) -Floating
      %g   # 浮動小数(浮動少数または指数形式のうち、少ないスペースで表現できる方)
      %G   # %g の指数表示をEにしたもの
      %ld  # 倍精度10進数 -Long
      %lo  # 倍精度8進数
      %lu  # 倍精度符号なし10進数
      %lx  # 倍精度16進数
      %n   # すでに出力した文字数を次の変数に格納
      %o   # 8進数 -Octal
      %p   # ポインタ (16進数での値のアドレス)
      %s   # 文字列 -String
      %u   # 符号なし10進数 -Unsigned
      %x   # 符号なし16進数 -heXadecimal
      %X   # %x と同じだが大文字を使う