Hatena::Groupperl

moja8の日記

2008/05/23 (Fri)

今なんかもりあがってるのでチャンス 00:08

おすすめ書籍(no title)を参考に。

とりあえず、続・初めての Perl かなー次は。

MerceditaMercedita2012/08/20 17:45I will be putting this dazlizng insight to good use in no time.

xgcbxdnupvcxgcbxdnupvc2012/08/21 17:23mzOSd1 <a href="http://mfovdhagrxwc.com/">mfovdhagrxwc</a>

cfcucdzyacfcucdzya2012/08/22 15:53VPV88E <a href="http://ojobptgnhxwx.com/">ojobptgnhxwx</a>

khefgrotrjfkhefgrotrjf2012/08/24 22:42UWP3gl , [url=http://bnwjuyzagutf.com/]bnwjuyzagutf[/url], [link=http://lhqfnfdoupca.com/]lhqfnfdoupca[/link], http://ddvoonpyzcqz.com/

2007/12/01 (Sat)

[]初めてのPerl 7, 8, 9章 03:43

正規表現。7, 8章は一般的な(?)正規表現に関するはなし。9章は Perl で使うときのはなし。そろそろ中だるみ。

載ってたの

パターンをかこむの
/pattern/ または、 m/pattern/, m#pattern#, m(pattern) etc.
全ての文字にマッチする文字クラス
[\d\D] (数字と非数字にマッチ。改行文字にもマッチ。マッチマッチて。/s 修飾子を使うことで . が改行文字にもマッチする。Ruby でいうところの m オプションと同じ。)
後方参照
正規表現のパターン内では \1 たとえば、 /(.)\1/ は任意の文字2文字にマッチ。(.) でマッチした任意の1文字を、パターン内の \1 で後方参照する→任意の文字が2文字。
メモリ変数
$1 といった変数で、パターンマッチ後に参照する。ちなみに $0 はプログラムの名前が入ってるので関係ない。
$`, $&, $'
使うと少し遅くなるらしいので $1 使う方がよいかも。
*
{0,}
+
{1,}
?
{0,1}

載ってなかったけどこんなのもあった気がするの

my $aaa = "baaaaaaaaaaaaaaaaaaaaaaaaaaa";
if ($aaa =~ /(b.+?)/) {
   print $1, "\n";
}

# 最短マッチ。
# ba
my $aaa = "fred wilma aaa";
if ($aaa =~ /(?:f.+)\s(w.+)\s/) {
  print $1, "\n";
}

# (?:) のメモリ変数に入れないようにするやつ
# wilma

split, join関数

my @hairetu1 = split /\s+/, "  ai ue  o\tkakiku\nke     ko  ";
my @hairetu2 = split ' ', "  ai ue  o\tkakiku\nke     ko  ";
my $mojiretu1 = join ":", @hairetu1;
my $mojiretu2 = join ":", @hairetu2;
print "$mojiretu1\n";
print "$mojiretu2\n";

# :ai:ue:o:kakiku:ke:ko
# ai:ue:o:kakiku:ke:ko
# \s+ で分割すると、行頭にある空白文字列も区切って、空文字列ができる
# ' ' で分割すると、行頭の空白文字で区切らず、空文字列が返ってこない
# 行末の空白は捨てられる

KarlaKarla2012/06/07 18:20I'm relaly into it, thanks for this great stuff!

jiatcurnjiatcurn2012/06/11 04:05LpLkI9 , [url=http://qxsvnvllnofe.com/]qxsvnvllnofe[/url], [link=http://ildsfysxjwpu.com/]ildsfysxjwpu[/link], http://kmukrhyzfqxt.com/

lgbfiwlgbfiw2012/06/12 04:55jyGtwj <a href="http://wahgryshpyoc.com/">wahgryshpyoc</a>

2007/11/28 (Wed)

[]初めてのPerl 6章 03:02

入出力。いわゆる I/O というやつ。

<>演算子

while (<>) {
  chomp;
  print "$_ dayo!\n";
}
  • 引数がないときは標準入力からになる
  • 引数にファイル名があるときはそのファイルを読み込む
  • 引数 "-" は標準入力からになる

ここでの引数は起動引数のこと。スクリプトに渡すアレ。

user@linux:~$ perl ./my_script.pl filename_a - failname_b

ここでの標準入力はデフォルトの、キーボードからの入力のこと。

@ARGV

@ARGV に起動引数のリストが入っている。もちろん、スクリプト中でこれに値を入れてもいい @ARGV = qw# aaa bbb ccc # みたいに。


printf

%g
数値をいい感じに変換してくれる
%f
float、浮動小数点
%d
10進数
%o
8進数
%x
16進数
%s
文字列
%%
%のエスケープ

フォーマットはダブルクォート文字列でつくる。訂正: 文字列で作る。

my $my_format = "%10d\n %-10d\n %+10f\n %010x\n %010s\n";
my @my_list = qw(1000 1000.5 -123.4567 255 abcd );
printf $my_format, @my_list; 
# % -(左寄せ) +(正負付きで表示) 文字(埋め草) 数字.小数(桁数.小数点以下の桁数) sdfgox(フォーマットのアレ)
# 埋め草: 桁数がたりないとき不足分を埋める文字

以下は表示結果。

      1000
 +1000     
 -123.456700
 00000000ff
 000000abcd

2007/11/27 (Tue)

[]初めてのPerl 5章 21:30

ハッシュ。

全体的なこと

ハッシュ全体は %で
%hash_hensuu
ハッシュの要素は $hash_name{key}
key には文字列、変数、式などを
ダブルクォート文字列で展開されない
printf とかのフォーマットに % 使うから
未定義のキーで参照すると undef 返ってくる
変数とかと同じ

キー

キーは文字列に変換される。あと式の結果、変数の内容。キー全体で固有のものを。キーが重複したときは後に定義したもので上書きされる。

my %family_name = (
  pip => "ereki",
  "t" => "ttttt",
);

$family_name{"fred"} = "flintstone";
$family_name{"barney"} = "rubble";
$family_name{dododo} = "itsu";
$family_name{1.000} = "ichi";
$family_name{5/2} = "ni ten go";
$family_name{"5/2"} = "ni bun-no go";
$family_name{"$family_name{fred}"} = "fred no value";
# カオス…

foreach (keys %family_name) {
  print "key: $_ , value: $family_name{$_}.\n";
}

# 以下表示。()内は但し書き
# key: barney , value: rubble.
# key: 1 , value: ichi.  (1.000 が 1 になった)
# key: 5/2 , value: ni bun-no go.  ("5/2" がキー)
# key: flintstone , value: fred no value.  ($family_name{fred} がキー)
# key: 2.5 , value: ni ten go.  (5/2 がキー。式の結果が "2.5")
# key: dododo , value: itsu.  (裸の文字列でもおk)
# key: fred , value: flintstone.
# key: t , value: ttttt.
# key: pip , value: ereki.

スカラーコンテキスト、リストコンテキストでの扱い

真偽値のとこではスカラーコンテキストで評価するし、 while とかで使える。

print "list_keys: ", keys %family_name, "\n";
print "list_values: ", values %family_name, "\n";
my $count = keys %family_name;
print "number of keys: ", $count, "\n";

print %family_name . "\n";
# スカラーコンテキストでは "5/8" と表示される。
# これは Perl メンテナ用の内部デバック情報だとか。

print %family_name , "\n";
# リストコンテキストではリストへの変換と同じ結果になる。
# もちろん順番は一定じゃない。
# barneyrubble1ichi5/2ni bun-no goflintstonefred no value2.5ni ten godododoitsufredflintstonettttttpipereki


my %unk;
print %unk . "\n";
print %unk , "\n";
# 空のハッシュは、
#   スカラーコンテキストでは "0"
#   リストコンテキストでは ()
# なので真偽値に使えるyp!
# (真偽値はスカラーコンテキストで評価される)


# 以下表示。 
# list_keys: barney15/2flintstone2.5dododofredtpip
# list_values: rubbleichini bun-no gofred no valueni ten goitsuflintstonetttttereki
# number of keys: 9
# 5/8
# barneyrubble1ichi5/2ni bun-no goflintstonefred no value2.5ni ten godododoitsufredflintstonettttttpipereki
# 0
# 

2007/11/24 (Sat)

[]初めてのPerl 4章 00:15

変数宣言的なものに my がある

my($a, $b);

ここでは型とかは決まらない。

local

local は既に使われている変数の内容を一時的に保存し、サブルーチン内で新たな値を代入することができる(?)。サブルーチンを抜けたあとは元の値に戻す。

$uge = "first";
$return_value = &test_local_sub;
print "$return_value\n";
print "$uge\n";

sub test_local_sub {
    print "$uge\n";          # 既に代入されてる値を表示
    local($uge) = "second";  # local 使って違う値を代入
    print "$uge\n";          # 今 local で入ってる値を表示
    $uge;                    # この今 local で入ってる値をサブルーチンの結果として返す
}

# 結果。つかこれ use strict とかすると怒られる。
# first     サブルーチンで表示させたグローバル変数の値
# second    サブルーチンで local で代入した値
# second    サブルーチンで local で代入した値 を サブルーチンの戻り値にしたやつ
# first     グローバル変数の値(サブルーチンの外)

何書いてるかわかりにくい件。とりあえず、あまり local は使わない方がよいらしい。

my あと変数宣言

  • my を使うことで変数の有効範囲をそのブロック内にとどめる。ブロック内でも、 my 使わなければそれはグローバル変数。
  • $a, $b は変数宣言しないほうがよさげ。sort で比較するとき使うからとかなんとか。
  • use strict しよう。

その他

引数は特に指定しなくても可変長引数。@_ に引数リストが入ってる。

練習問題

#!/usr/bin/perl
use strict;
use warnings;

sub total {
  my $sum = 0;      # 0で初期化したほうが確実に数値を返すことになるのでいいとか。
  foreach (@_) {    # ↑型とかないけど明示的に数値代入するとわかりやすい感じでよい?
    $sum += $_;
  }
  $sum;
}

my @fred = qw{ 1 3 5 7 9 };
my $fred_total = &total(@fred);
print "The total of \@fred is $fred_total.\n";
print "Enter some numbers onseparate lines: ";
my $user_total = &total(<STDIN>);
print "The total of those numbers is $user_total.\n";

関数のダブルクォート文字列の変数展開的なのは、今までの知識では無理。

ShailendraShailendra2012/08/22 13:59What a neat artcile. I had no inkling.

kaxuhhfsfkaxuhhfsf2012/08/23 11:38Pof13d <a href="http://olkklbwghqar.com/">olkklbwghqar</a>

mbhyyjczmbhyyjcz2012/08/23 23:55vuveU3 , [url=http://uhwaqipqpxzn.com/]uhwaqipqpxzn[/url], [link=http://qldrhrgwpjau.com/]qldrhrgwpjau[/link], http://zlnoahmwavoi.com/

bbyqncbbyqnc2012/08/25 17:46j5l3IF , [url=http://ejmkgrwtuuny.com/]ejmkgrwtuuny[/url], [link=http://mcyocmkpxgfm.com/]mcyocmkpxgfm[/link], http://fposiiwlmdtq.com/