2010年12月17日金曜日

基本的な配列とハッシュの要素数の求め方(最大インデックスもあり)

燈明日記より 配列の要素数の求め方は、配列変数をスカラーコンテキストで評価します。 配列の最大インデックスの求め方は、配列変数のファニー文字『@』を『$#』に変えます。 ハッシュの素数の求め方は、keys関数か、またはvalues関数のリターン値をスカラーコンテキストで評価します。
use strict;
use warnings;

print "◆ 配列 -----------------------------------------\n";
my @aa = (1, 2, 3);
print $#aa, "\n";                     # 配列最大インデックス
print scalar(@aa), "\n";              # 配列要素数
print $aa[0], "\n";                   # 要素アクセス例


print "◆ ハッシュ -------------------------------------\n";
my %hh = (a => 1, b => 2, c => 3);
print scalar(keys(%hh)), "\n";        # ハッシュ要素数
print scalar(values(%hh)), "\n";      # ハッシュ要素数
print $hh{a}, "\n";                   # 要素アクセス例


print "◆ 配列の配列 -----------------------------------\n";
my @aa_aa = ([1, 2, 3, 4], 
             [5, 6, 7, 8], 
             [9, 10, 11, 12]);
print $#aa_aa, "\n";                  # 1次元配列最大インデックス
print scalar(@aa_aa), "\n";           # 1次元配列要素数
print $#{$aa_aa[0]}, "\n";            # 2次元配列最大インデックス
print scalar(@{$aa_aa[0]}), "\n";     # 2次元配列要素数
print $aa_aa[0][0], "\n";             # 要素アクセス例


print "◆ 配列のハッシュ -------------------------------\n";
my %hh_aa = (a => [1, 2, 3], 
             b => [4, 5, 6], 
             c => [7, 8, 9]);
print scalar(keys(%hh_aa)), "\n";     # 1次元ハッシュの要素数
print scalar(values(%hh_aa)), "\n";   # 1次元ハッシュの要素数
print $#{$hh_aa{a}}, "\n";            # 2次元配列最大インデックス
print scalar(@{$hh_aa{a}}), "\n";     # 2次元配列要素数
print $hh_aa{a}[0], "\n";             # 要素アクセス例


print "◆ ハッシュの配列 -------------------------------\n";
my @aa_hh = ({a => 1, b => 2}, 
             {c => 3, d => 4});
print $#aa_hh, "\n";                     # 1次元配列最大インデックス
print scalar(@aa_hh), "\n";              # 1次元配列要素数
print scalar(keys(%{$aa_hh[0]})), "\n";  # 2次元ハッシュの要素数
print scalar(values(%{$aa_hh[0]})), "\n";# 2次元ハッシュの要素数
print $aa_hh[0]{a}, "\n";                # 要素アクセス例


print "◆ ハッシュのハッシュ ----------------------------\n";
my %hh_hh = (x => {a => 1, b => 2}, 
             y => {c => 3, d => 4});
print scalar(keys(%hh_hh)), "\n";        # 1次元ハッシュの要素数
print scalar(values(%hh_hh)), "\n";      # 1次元ハッシュの要素数
print scalar(keys(%{$hh_hh{x}})), "\n";  # 2次元ハッシュの要素数
print scalar(values(%{$hh_hh{x}})), "\n";# 2次元ハッシュの要素数
print $hh_hh{x}{a}, "\n";                # 要素アクセス例


print "◆ 配列の配列の配列--------------------------------\n";
my @aa_aa_aa = ([[1, 1], [2, 2]], 
                [[3, 3], [4, 4]], 
                [[5, 5], [6, 6]]);
print $#aa_aa_aa, "\n";                  # 1次元配列最大インデックス
print scalar(@aa_aa_aa), "\n";           # 1次元配列要素数
print $#{$aa_aa_aa[0]}, "\n";            # 2次元配列最大インデックス
print scalar(@{$aa_aa_aa[0]}), "\n";     # 2次元配列要素数
print $#{$aa_aa_aa[0][0]}, "\n";         # 3次元配列最大インデックス
print scalar(@{$aa_aa_aa[0][0]}), "\n";  # 3次元配列要素数
print $aa_aa_aa[0][0][0], "\n";          # 要素アクセス例


print "◆ 配列の配列のハッシュ----------------------------\n";
my %hh_aa_aa = (a => [[1, 2], [3, 4]], 
                b => [[5, 6], [7, 8]]);
print scalar(keys(%hh_aa_aa)), "\n";            # 1次元ハッシュの要素数
print scalar(values(%hh_aa_aa)), "\n";          # 1次元ハッシュの要素数
print $#{$hh_aa_aa{a}}, "\n";                   # 2次元配列最大インデックス
print scalar(@{$hh_aa_aa{a}}), "\n";            # 2次元配列要素数
print $#{$hh_aa_aa{a}[0]}, "\n";                # 3次元配列最大インデックス
print scalar(@{$hh_aa_aa{a}[0]}), "\n";         # 3次元配列要素数
print $hh_aa_aa{a}[0][0], "\n";                 # 要素アクセス例


print "◆ 配列のハッシュの配列--------------------------\n";
my @aa_hh_aa = ({a => [1, 1], b => [2, 2]}, 
                {c => [3, 3], d => [4, 4]});
print $#aa_hh_aa, "\n";                         # 1次元配列最大インデックス
print scalar(@aa_hh_aa), "\n";                  # 1次元配列要素数
print scalar(keys(%{$aa_hh_aa[0]})), "\n";      # 2次元ハッシュの要素数
print scalar(values(%{$aa_hh_aa[0]})), "\n";    # 2次元ハッシュの要素数
print $#{$aa_hh_aa[0]{a}}, "\n";                # 3次元配列最大インデックス
print scalar(@{$aa_hh_aa[0]{a}}), "\n";         # 3次元配列要素数
print $aa_hh_aa[0]{a}[0], "\n";                 # 要素アクセス例


print "◆ 配列のハッシュのハッシュ--------------------------\n";
my %hh_hh_aa = (x => {a => [1, 1], b => [2, 2]}, 
                y => {c => [3, 3], d => [4, 4]});
print scalar(keys(%hh_hh_aa)), "\n";            # 1次元ハッシュの要素数
print scalar(values(%hh_hh_aa)), "\n";          # 1次元ハッシュの要素数
print scalar(keys(%{$hh_hh_aa{x}})), "\n";      # 2次元ハッシュの要素数
print scalar(values(%{$hh_hh_aa{x}})), "\n";    # 2次元ハッシュの要素数
print $#{$hh_hh_aa{x}{a}}, "\n";                # 3次元配列最大インデックス
print scalar(@{$hh_hh_aa{x}{a}}), "\n";         # 3次元配列要素数
print $hh_hh_aa{x}{a}[0], "\n";                 # 要素アクセス例


print "◆ ハッシュの配列の配列--------------------------\n";
my @aa_aa_hh = ([{a => 1, b => 2}, {c => 3, d => 4}], 
                [{e => 1, f => 2}, {g => 3, h => 4}]);
print $#aa_aa_hh, "\n";                         # 1次元配列最大インデックス
print scalar(@aa_aa_hh), "\n";                  # 1次元配列要素数
print $#{$aa_aa_hh[0]}, "\n";                   # 2次元配列最大インデックス
print scalar(@{$aa_aa_hh[0]}), "\n";            # 2次元配列要素数
print scalar(keys(%{$aa_aa_hh[0][0]})), "\n";   # 3次元ハッシュの要素数
print scalar(values(%{$aa_aa_hh[0][0]})), "\n"; # 3次元ハッシュの要素数
print $aa_aa_hh[0][0]{a}, "\n";                 # 要素アクセス例


print "◆ ハッシュのハッシュの配列--------------------------\n";
my @aa_hh_hh = ({x => {a => 1, b => 2}, y => {c => 3, d => 4}}, 
                {z => {e => 1, f => 2}});
print $#aa_hh_hh, "\n";                           # 1次元配列最大インデックス
print scalar(@aa_hh_hh), "\n";                    # 1次元配列要素数
print scalar(keys(%{$aa_hh_hh[0]})), "\n";        # 2次元ハッシュの要素数
print scalar(values(%{$aa_hh_hh[0]})), "\n";      # 2次元ハッシュの要素数
print scalar(keys(%{$aa_hh_hh[0]{x}})), "\n";     # 3次元ハッシュの要素数
print scalar(values(%{$aa_hh_hh[0]{x}})), "\n";   # 3次元ハッシュの要素数
print $aa_hh_hh[0]{x}{a}, "\n";                   # 要素アクセス例


print "◆ ハッシュの配列のハッシュ--------------------------\n";
my %hh_aa_hh = (z1 => [{a1 => 1, b1 => 2}, {x1 => 1, y1 => 2}], 
                z2 => [{a2 => 1, b2 => 2}, {x2 => 1, y2 => 2}]);
print scalar(keys(%hh_aa_hh)), "\n";              # 1次元ハッシュの要素数
print scalar(values(%hh_aa_hh)), "\n";            # 1次元ハッシュの要素数
print $#{$hh_aa_hh{z1}}, "\n";                    # 2次元配列最大インデックス
print scalar(@{$hh_aa_hh{z1}}), "\n";             # 2次元配列要素数
print scalar(keys(%{$hh_aa_hh{z1}[0]})), "\n";    # 3次元ハッシュの要素数
print scalar(values(%{$hh_aa_hh{z1}[0]})), "\n";  # 3次元ハッシュの要素数
print $hh_aa_hh{z1}[0]{a1}, "\n";                 # 要素アクセス例


print "◆ ハッシュのハッシュのハッシュ----------------------\n";
my %hh_hh_hh = (z1 => {x1 => {a1 => 1, b1 => 2}, y1 => {c1 => 3, d1 => 4}}, 
                z2 => {x2 => {a2 => 1, b2 => 2}, y2 => {c2 => 3, d2 => 4}});
print scalar(keys(%hh_hh_hh)), "\n";              # 1次元ハッシュの要素数
print scalar(values(%hh_hh_hh)), "\n";            # 1次元ハッシュの要素数
print scalar(keys(%{$hh_hh_hh{z1}})), "\n";       # 2次元ハッシュの要素数
print scalar(values(%{$hh_hh_hh{z1}})), "\n";     # 2次元ハッシュの要素数
print scalar(keys(%{$hh_hh_hh{z1}{x1}})), "\n";   # 3次元ハッシュの要素数
print scalar(values(%{$hh_hh_hh{z1}{x1}})), "\n"; # 3次元ハッシュの要素数
print $hh_hh_hh{z1}{x1}{a1}, "\n";                # 要素アクセス例

◆ アンチョコ

2010年12月16日木曜日

2次元配列を使用したテスト.pl

#!/usr/bin/perl
# Domain not found 通知スクリプト
# 2010.12.08 watari perl版 Ver.0.5
# 元々あった shell スクリプト版を元に
# 2重のドメイン検査及び、メーリングリストの
# 特定を盛り込む

# おまじない
use POSIX 'strftime';

# お約束
## Mailman コマンド
$findmember = "/path/to/mailman/bin/find_member";
$listowners = "/path/to/mailman/bin/list_owners";
## メール関連
$testmailaddr = "watari\@hogefuga";
$subject = "=?ISO-2022-JP?B?GyRCJWEhPCVqJXMlMCVqJTklSEdbQXclKCVpITxETENOGyhC?=";
## ログファイル
$logfile = "/path/to/mailman/logs/domain_errori_test";
## 一時ファイル
$tmpdata = "/tmp/den_tmp.data_test";
## smtp-failure
$errlog = "/path/to/mailman/logs/smtp-failure-test";
#$errlog = "/path/to/mailman/logs/smtp-failure";
## smtp
#$oklog = "/path/to/mailman/logs/smtp-test";

# 日付の準備
## 前日は time から 86400 を引く。
## その他の日は、 日数 x 86400 を引く。
###$ltime = time-86400;
## (検証用)
##日数の指定
$datecounts = 9;
#$datecounts = 1;
$ltime = time-(86400*${datecounts});
## 引っ掛けるログの対象日付
$taisho = strftime "%b %d", localtime($ltime);
$taisho2 = strftime "%b %d", localtime(time);

## 力技処理。実行時 (LANG=C; ./このスクリプト) で不要だが。
%month = (
    " 1月" => "Jan", " 2月" => "Feb", " 3月" => "Mar", " 4月" => "Apr",
    " 5月" => "May", " 6月" => "Jun", " 7月" => "Jul", " 8月" => "Aug",
    " 9月" => "Sep", "10月" => "Oct", "11月" => "Nov", "12月" => "Dec"
);

while ( my ( $key, $value ) = each ( %month ) ) {
    $taisho =~ s/$key/$value/g;
    $taisho2 =~ s/$key/$value/g;
}

## uniq 処理サブルーチン
## &f_uniq(元配列名,処理後配列名);
sub f_uniq {
    @sortedlines = sort @{$_[0]};
    if ( $sortedlines[0] =~ /.+/ ) {
        push(@{$_[1]}, $sortedlines[0]);
        for ( $i = 1; $i < @sortedlines; $i++ ) {
            if ( $sortedlines[$i] ne $sortedlines[$i-1]) {
                push(@{$_[1]}, $sortedlines[$i]);
            }
        }
    }
}


# お仕事開始
## Domain not found のエラー抽出
open(SMTPERR, "< $errlog") || die "Error: $errlog \n";
while() {
    chomp;
    # 該当メールアドレスの抽出
    if ( $_ =~ /$taisho/ && $_ =~ /Domain not found/ && $_ =~ /refused/ ) {
        @array = split( / +/, $_);
        $array[11] =~ s/<|>://g;
        if ( $array[11] !~ /^[^@]+@[^.]+\..+/ ) {
            print "$array[11] は、メールアドレスではありません。作業を中止します。\n";
            exit(1);
        } else {
            $array[19] =~ s/<|>//g;
            @ml_tmp = split( /\./, $array[19] );
            $ml_tmp[4] =~ s/\@cc//g;
            if ( $ml_tmp[4] !~ /^[a-z][a-z|0-9]*\-[a-z|0-9]+/ ) {
                print "$ml_tmp[4] は、正しいメーリングリスト名ではありません。作業を中止します。\n";
                exit(1);
            } else {
                push(@errml  ???????

perl メモ

mailman の Domain not found スクリプトより

## Domain not found のエラーから、該当するメールアドレスとメーリングリスト名を抽出
open(SMTPERR, "< $errlog") || die "Error: $errlog \n";
while() {
    chomp;
    if ( $_ =~ /$taisho/ && $_ =~ /Domain not found/ && $_ =~ /refused/ ) {
        @array = split( / +/, $_);
        # 該当メールアドレスの抽出
        $array[11] =~ s/://g;
        if ( $array[11] !~ /^[^@]+@[^.]+\..+/ ) {
            print "$array[11] は、メールアドレスではありません。作業を中止します。\n";
            exit(1);
        } else {
            # メーリングリストの抽出
            $array[19] =~ s///g;
            @ml_tmp = split(/\./, $array[19]);
            $ml_tmp[4] =~ s/\@cc//g;
            if ( $ml_tmp[4] !~ /^[a-z][a-z|0-9]*\-[a-z|0-9]+/ || $ml_tmp[4] !~ /mailman/ ) {
                print "$ml_tmp[4] は、正しいメーリングリスト名ではありません。作業を中止します。\n";
                exit(1);
            } else {
                ## $dnfml[数][0] が、メールアドレス、$dnfml[数][0] が、ML名
                @dnfml = (
                    [ "$array[11]", "$ml_tmp[4]" ]
                );
            }
        }
    }
}
close(SMTPERR);

foreach(@errlogdata) {
    if( $_ =~ /$taisho/ && $_ =~ /$eaddr/ && $_ =~ /refused/ && $_ =~ /Domain not found/ ) {
        @array = split(/ +/, $_);
        # メーリングリストの抽出
        $array[19] =~ s///g;
        @ml_tmp = split(/\./, $array[19]);
        $ml_tmp[4] =~ s/\@cc//g;
        if ( $ml_tmp[4] !~ /^[a-z][a-z|0-9]*\-[a-z|0-9]+/ ) {
            print "$ml_tmp[4] は、正しいメーリングリスト名ではありません。作業を中止します。\n";
            exit(1);
        } else {
            $ml_pre = $ml_tmp[4];
        }
    }
}


### 多次元配列用uniq処理
### @hoge[i] までが配列名なので、

途中か?

DNS named.root 更新確認スクリプト

#!/bin/bash # DNSのnamed.rootファイルの更新確認スクリプト # 最新版のnamed.rootファイルを取得し、差分を確認する。 # 更新履歴 # 2014.02.07 watari # お約束 export LANG=C ## 実行ディレクトリ #PR...