このサイトはblogban.net(2016年3月にドメイン有効期限切れで閉鎖)のログを保管しているサイトです。
各投稿の権利は当時の投稿者に帰属します。
なお、本サイトでは発信者情報は一切保存しておりませんのでご了承下さい。
過去ログ倉庫ですので書き込みはできません。


なお当時のblogbanの規約に基づき本サイトのログはアフィリエイトブログへの転載を全面的に禁止します。


専ブラ対応済みです。このURLをそのまま外部板登録すると閲覧できます。


お問い合わせはこちらまで



■掲示板に戻る■ 全部 1- 101- 最新50 [PR]ぜろちゃんねるプラス[PR]  

Perlについて

1 :名無しさん名前募集中。。。:2013/07/07(日) 15:07:34.53 ID:j0iarVna0
TMTOWTDI = There's more than one way to do it.
やり方はひとつじゃない。

じゃあ、Perlについて語ろうか。

Perl Download
http://www.perl.org/get.html

2 :名無しさん名前募集中。。。:2013/07/07(日) 15:07:54.62 ID:j0iarVna0
[本]
初めてのPerl 第6版 (リャマ): http://www.oreilly.co.jp/books/9784873115672/
プログラミングPerl 第3版 (ラクダ) : http://www.oreilly.co.jp/books/4873110963/ http://www.oreilly.co.jp/books/4873110971/
Effective Perl: http://ascii.asciimw.jp/books/books/detail/4-7561-3057-7.shtml
Perlクックブック 第2版: http://www.oreilly.co.jp/books/4873112028/ http://www.oreilly.co.jp/books/4873112036/
Perl ベストプラクティス: http://www.oreilly.co.jp/books/4873113008/

[オンラインマニュアル]
最新のドキュメント(英語): http://perldoc.perl.org/
perldoc.jp(日本語): http://perldoc.jp/

[モジュール]
CPAN: http://search.cpan.org/
今どきのCPAN環境構築術(cpanm, perlbrew): http://gihyo.jp/dev/serial/01/perl-hackers-hub/000701

[テクニック]
Perl Hackers Hub: http://gihyo.jp/dev/serial/01/perl-hackers-hub
モダンPerlの世界へようこそ: http://gihyo.jp/dev/serial/01/modern-perl/0001
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/

[Perl Unicodeメモ]
Perl における Unicode のチュートリアル: http://perldoc.jp/docs/perl/5.16.1/perlunitut.pod
Perl Unicode の手引き: http://perldoc.jp/docs/perl/5.8.1/perluniintro.pod
http://www.rwds.net/kuroita/program/Perl_unicode.html
http://www.namazu.org/~tsuchiya/perl/perl-5.8.html
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html

3 :名無しさん名前募集中。。。:2013/07/07(日) 15:08:33.58 ID:j0iarVna0
ここまでテンプレ。

4 :名無しさん名前募集中。。。:2013/07/07(日) 15:36:32.64 ID:j0iarVna0
てけとうにかちゅ〜しゃのblogban用other.brdを作る。

use 5.016;
use warnings;
use URI;
use Web::Scraper;
use File::Slurp;
use Encode;

my $brd = scraper {
process 'div#left a', 'board[]' => { uri => '@href', text => 'TEXT' };
};
my $uri = URI->new('http://blogban.net/top.html');
my $res = $brd->scrape($uri);

my @list =
map{ "\t$_->[0]\t$_->[1]\t$_->[2]\n" }
grep{ $_->[1] }
map{
my @segments = $_->{uri}->path_segments;
my $board = pop(@segments) || pop(@segments);
[ $_->{uri}->authority, $board, $_->{text} ]
} @{$res->{board}};

write_file('_other.brd', map{ encode(CP932 => $_) } @list);

5 :名無しさん名前募集中。。。:2013/07/12(金) 16:37:34.44 ID:XjSV1JJ60
人も居ないし、『初めてのPerl』(http://www.amazon.co.jp/dp/4873115671/)を読みながら、
そろりそろりと解説してみる。

6 :名無しさん名前募集中。。。:2013/07/12(金) 16:51:38.33 ID:XjSV1JJ60
[初めてのPerl] Randal L. Schwartz & brian d foy & Tom Phoenix 近藤 嘉雪(訳),
2012,始めてのPerl第6版,オライリー・ジャパン

FAQとは言わないけれど、たまに出る質問。

1.2 Perlとは何の略でしょうか?
> "Practical Extraction and Report Language"(実用データ取得レポート作成用言語)の略
> "Pathologically Eclectic Rubbish Lister"(病的折衷主義のがらくた出力機)とも呼ばれます。
(初めてのPerl,p.5)

と、ありますが、perldocでは以下のように。

http://perldoc.jp/docs/perl/5.16.1/perl.pod
> Perl は公式には "Practical Extraction and Report Language" の略ですが、 そうでない場合もあります。
(略)
> Perl は本当は「病的折衷主義ガラクタ出力機」(Pathologically Eclectic Rubbish Lister) を
> 意味していますが、私がそういった 事をばらしてはいけません。

なんというか、基本的にPerl使いは冗談好きな人が多いのですが、世の中には100人に1人ぐらい
(web上では更に多く)の割合で冗談が通じない人が居るため、この表現は、あまり使われてません。
揶揄に使われることが多いです。

7 :名無しさん名前募集中。。。:2013/07/12(金) 16:56:58.41 ID:XjSV1JJ60
1.2.8 どうやってPerlを手に入れるのでしょうか?
Unix系のOSならば、最初からインストールされてるものを使えばOK。
もし無くても、パッケージなどで提供されているでしょう。
また、Perlbrewを使ってユーザー権限でPerlを導入することも可能です。

Windowsなら、Active State(http://www.activestate.com/activeperl/downloads)
またはStrawberry Perl(http://strawberryperl.com/)でバイナリパッケージを
入手することができます。

8 :名無しさん名前募集中。。。:2013/07/12(金) 22:28:01.27 ID:XjSV1JJ60
perlbrew(http://perlbrew.pl/)を使ってインストール
例:Linux(Debian)の場合。

perlbrewをインストール

$ curl -L http://install.perlbrew.pl | bash

.bash_aliases(または.bashrc)に追加して、sourceを実行、動くか確かめる。

$ echo 'source ~/perl5/perlbrew/etc/bashrc' >> ~/.bash_aliases
$ source ~/perl5/perlbrew/etc/bashrc
$ perlbrew

perlをインストール(時間がかかります)

$ perlbrew install perl-5.18.0 --as perl-5.18

listで確かめて、switchして、バージョンを確認。

$ perlbrew list
$ perlbrew switch perl-5.18
$ perl -v

※perlbrewは、バージョンによって操作が異なることがあります。

9 :名無しさん名前募集中。。。:2013/07/12(金) 22:33:57.71 ID:XjSV1JJ60
Windows環境
例:ActivePerlの場合。

Active Stateのサイト(http://www.activestate.com/activeperl/downloads)から
ダウンロードしてインストール。
64bit版/32bit版では、整数範囲が変わります。
32bit版の場合、一部モジュールに制限があることがあります。

エディタが無い場合、UTF-8を編集できるエディタを選んでインストール。
ターミナルエミュレータが無い場合、何か選んでインストール。

ターミナルエミュレータの代わりにコマンドプロンプトを使うこともできますが、
ターミナルエミュレータの方が便利なようです。

この辺りを参考にすると良いかも。
ttp://tanakh.jp/posts/2013-05-23-windows-setup.html

10 :名無しさん名前募集中。。。:2013/07/12(金) 22:41:29.96 ID:XjSV1JJ60
ActivePerlには通常のCPANに加え、ppm(Perl Package Manager)という
バイナリパッケージも使えます。
ppmにあるモジュールは、だいたい使えるので、そこそこ便利です
(稀にWindows環境で使えないものが混じってるので注意が必要だったりします)。

11 :名無しさん名前募集中。。。:2013/07/13(土) 09:53:18.46 ID:/OP0uq860
1.2.9 CPANとは何でしょうか?
> CPANとは総合Perlアーカイブネットワーク(Comprehensive Perl Archive Network)の
> ことで、そこではPerlに関するあらゆるものが手に入ります。
(初めてのPerl,p.5)

CPAN(http://www.cpan.org/)

検索するには
Search CPAN(http://search.cpan.org/)
MetaCPAN(https://metacpan.org/)

Perlモジュールをインストールするには、cpanやcpanmツールを使うのが便利です。

システムに付属するPerlにモジュールをインストールするにはroot権限が必要ですが、
local::libモジュールを使うことで、ユーザー権限でモジュールをユーザー領域に
インストールすることができます。

perlbrewを使い、ユーザー権限でインストールしたPerlの場合は、ユーザー権限で
モジュールをインストールできます。

12 :名無しさん名前募集中。。。:2013/07/13(土) 09:53:57.87 ID:/OP0uq860
ユーザー権限でlocal::libをインストール
例:Linux(Debian)の場合

search.cpanで最新のバージョンを確認した後。

$ curl -L http://search.cpan.org/CPAN/authors/id/E/ET/ETHER/local-lib-1.008010.tar.gz | tar xz
$ cd local-lib-1.008010
$ perl Makefile.PL --bootstrap
$ make && make test
$ make install

実行確認
$ perl -I~/perl5/lib/perl5 -Mlocal::lib

.bash_aliases(または.bashrc)に追記
$ echo 'eval $(perl -I$HOME/local/lib/perl5 -Mlocal::lib)' >>~/.bash_aliases

こちらも参照してください。
http://blog.hide-k.net/archives/2009/02/locallibrootcpa.php

13 :名無しさん名前募集中。。。:2013/07/13(土) 10:36:56.83 ID:/OP0uq860
1.2.11 他の種類のサポートはあるのでしょうか?
ユーザーグループ
・Perl Mongers (http://www.pm.org/groups/japan.html)
・Perl-users.jp (http://perl-users.jp/)
サイト(英語)
・Perl Monks (http://www.perlmonks.org/)
・Stack Overflow (http://stackoverflow.com/)
・Lern Perl (http://learn.perl.org/)
ドキュメント
・Perlに附属するPerldoc
・perldoc.perl.org(英語) (http://perldoc.perl.org/)
・perldoc.jp(日本語) (http://perldoc.jp/)

・『プログラミングPerl』通称「ラクダ本」 (http://www.oreilly.co.jp/books/4873110963/ http://www.oreilly.co.jp/books/4873110971/)
・『初めてのPerl』通称「リャマ本」(http://www.oreilly.co.jp/books/9784873115672/)

14 :名無しさん名前募集中。。。:2013/07/13(土) 21:46:21.71 ID:/OP0uq860
1.3.1 単純なプログラム

Hello, world!を書いてみる。

Unix環境で、/usr/bin/にバージョン5.18のperlがインストールされている例。
#!/usr/bin/perl
use 5.018;
use warnings;

say "Hello, world!";

解説
1行目
シバン、シェバン、シェバング(shebang)と呼ばれる行。
スクリプトを読ませるツールをフルパスで指定する(オプションも渡せる)。
この場合、"/usr/bin/perl"が使われる。

"#!/usr/bin/env perl"と書くと、PATHを参照してperlを探して、
最初に見つかったperlを実行してくれます。
ただし、Webサーバ、cronで動かす時など、PATHの設定が違う場合は動きません。
また、セキュリティ上の問題もある(PATHを探して最初に見つかった"perl"という
ファイルが何であっても実行される)ため、勉強するために限定するのがいいでしょう。

シバン (Unix)
http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%90%E3%83%B3_%28Unix%29
perlrun - Perl インタプリタの起動方法
http://perldoc.jp/docs/perl/5.16.1/perlrun.pod

Windows環境では省略しても問題ありませんが、"#!perl"と書くのが慣例です。

2行目
perlのバージョンが5.18以降なら実行、それ以前ならエラーにするための宣言です。
この宣言で、いくつかの機能を導入します。
あなたが使うperlバージョンに合わせてください。
5.12より前のバージョンを指定する場合、strictプラグマも使ってください。

use
http://perldoc.jp/func/use

3行目
warningsプラグマで、警告機能をonにします。
通常のプログラミング言語では、警告機能をoffにする機能が付きますが、Perlでは逆です。

warnings - 選択的な警告を調整する Perl プラグマ
http://perldoc.jp/docs/perl/5.8.1/warnings.pod

5行目
"say"は標準関数なのですが、featureプラグマで使う事を宣言するか、
バージョン5.10以降のperlで、バージョンを宣言するか、"CORE::say"と
書かなければ使えません。
バージョン5.10以降の機能なので、それ以前のバージョンは"print"を使ってください。

say
http://perldoc.jp/func/say
feature - 新しい構文上の機能を有効にするプラグマ
http://perldoc.jp/docs/modules/feature-1.13/feature.pod

15 :名無しさん名前募集中。。。:2013/07/13(土) 21:48:44.40 ID:/OP0uq860
Windowsで、バージョン5.16.3のperlがインストールされている例。
#!perl
use 5.016;
use warnings;

say "Hello, world!";


Unix環境で、バージョン5.18.0のperlがperlbrewでインストールされている例。
#!/usr/bin/env perl
use 5.018;
use warnings;

say "Hello, world!";


Unix環境で、/usr/bin/にバージョン5.8.9のperlがインストールされている例。
#!/usr/bin/perl
use strict;
use warnings;

print "Hello, world!\n";

以上のように、シェバン行、バージョン指定行辺りは、実行する環境によって異なるために
省略されて書かれる事が多いのですが、実際のスクリプトではきちんと書いてください。

面倒に思えますが、書き出しの部分は、一度決まれば後は同じコードを繰り返し使うだけです。

16 :名無しさん名前募集中。。。:2013/07/14(日) 12:15:33.71 ID:QmGhmO6n0
2.1 数値

Perlでは、数値は倍精度浮動小数点数で表現され計算されます。
ユーザが数値が整数か実数か意識する必要はありません。

ただ、内部では整数・倍精度浮動小数点数で保持してたりします。

2.1.2 浮動小数点数リテラル
2.1.3 整数リテラル

リテラル(literal)とは、Perlソースコードに直接書かれたデータ(定数)のことです。

perldata - Perl のデータ型 スカラ値のコンストラクタ
http://perldoc.jp/docs/perl/5.8.8/perldata.pod#Scalar32value32constructors

use 5.016;
use warnings;
use B qw(svref_2object);

sub svtype {
my ($sv) = @_;

my $sv_obj = svref_2object(\$sv);

if ($sv_obj->FLAGS & B::SVf_IOK){
my $type = ($sv_obj->FLAGS & B::SVf_IVisUV ? 'UV' : 'IV');
return ("$type: " . $sv_obj->int_value);
}
if ($sv_obj->FLAGS & B::SVf_NOK){
return ("NV: " . $sv_obj->NV);
}
if ($sv_obj->FLAGS & B::SVf_POK){
return ("PV: " . $sv_obj->PV);
}

return "??: ??";
}

foreach(
12345,
12345.67,
.23E-10, # a very small number
3.14_15_92, # a very important number
4_294_967_296, # underscore for legibility
0xff, # hex
0xdead_beef, # more hex
0377, # octal (only numbers, begins with 0)
0b011011, # binary
){
say svtype($_);
}

結果
IV: 12345
NV: 12345.67
NV: 2.3e-011
NV: 3.141592
IV: 4294967296
IV: 255
IV: 3735928559
IV: 255
IV: 27

IVは符号付き整数、NVは倍精度浮動小数点数で保持されていることを表します。

17 :名無しさん名前募集中。。。:2013/07/14(日) 12:16:15.50 ID:QmGhmO6n0
2.2 文字列

文字を並べたものを文字列(string)と呼び、もっとも短い文字列は、
文字を一個も含まない文字列で、空文字列(empty string)と呼びます。

文字列リテラルの種類
シングルクォート文字列リテラル(single-quoted string literal)
ダブルクォート文字列リテラル(double-quoted string literal)

http://perldoc.jp/docs/perl/5.8.8/perldata.pod#Scalar32value32constructors
> ダブルクォートの文字列リテラルでは、バックスラッシュの置換と 変数の置換が行なわれ、
> シングルクォートの文字列では、 (\' と \\を除いて)これらの置換は行なわれません。

perlop - Perl の演算子と優先順位 クォートとクォート風の演算子
http://perldoc.jp/docs/perl/5.16.1/perlop.pod#Quote32and32Quote-like32Operators

特殊な文字列リテラル

バージョン文字列
http://perldoc.jp/docs/perl/5.8.8/perldata.pod#Version32Strings
> 注意: バージョン文字列 (v-文字列) は非推奨です。
> v1.20.300.4000 の形のリテラルは、指定された序数を持つ文字からなる
> 文字列としてパースされます。 この形はv-文字列と呼ばれ、より読みにくい
> 文字変換形式 "\x{1}\x{14}\x{12c}\x{fa0}" よりも読みやすい文字列を
> 構成する方法を 提供します。

perlop - Perl の演算子と優先順位 単項演算子
http://perldoc.jp/docs/perl/5.16.1/perlop.pod#Symbolic32Unary32Operators
> 単項演算子の "-" は被演算子が数値または数値に見える文字列であれば、
> 算術否定を行ないます。 被演算子が識別子ならば、マイナス記号にその識別子を
> つなげた 文字列が返されます。 これ以外で被演算子の最初の文字がプラスか
> マイナスのときには、 その記号を逆のものに置き換えた文字列を返します。
> この規則の結果、-bareword が文字列 "-bareword" に等価となります

18 :名無しさん名前募集中。。。:2013/07/14(日) 12:16:23.85 ID:QmGhmO6n0
文字列と数値の変換

文字列を数値に変換 (0 + '123')
数値を文字列に変換 ('' . 123)

実際には、殆どの場合において、数値か文字列かを意識する必要はありません。
Perlが適切に変換を行います。

use 5.016;
use warnings;

sub is_string { ($_[0] ^ $_[0]) =~ /^\x00*$/ }

foreach(
'single',
"double",
v102.111.111, # version string "foo"
-option, # string
-12, # numeral
'' . 12, # forces string
0 + '12', # forces numeric
){
say ((is_string($_) ? 'string: ' : 'numeral: '), $_);
}

結果
string: single
string: double
string: foo
string: -option
numeral: -12
string: 12
numeral: 12

19 :名無しさん名前募集中。。。:2013/07/14(日) 22:19:10.36 ID:QmGhmO6n0
2.3 Perlに組み込まれている警告メッセージ

プログラムに警告(warning)を出させるには、perlを"-w"オプション付きで
起動するか、warningsプラグマを使います。

perllexwarn - Perl のレキシカルな警告
http://perldoc.jp/docs/perl/5.16.1/perllexwarn.pod

警告の抑制

use 5.016;
use warnings;
use List::Util qw(reduce);

my $sum = reduce{ $a + $b } (1 .. 5);
say $sum;

上のコードを実行すると、下のような警告が出ます
(変数を一度しか使っていませんという内容)。
コードには問題が無いので、警告を抑制してみます。

Name "main::b" used only once: possible typo at ... line 5.
Name "main::a" used only once: possible typo at ... line 5.

まず、diagnosticsプラグマを加えて、詳しい警告内容を知ります。

use 5.016;
use warnings;
use diagnostics;
use List::Util qw(reduce);

my $sum = reduce{ $a + $b } (1 .. 5);
say $sum;

Name "main::b" used only once: possible typo at ... line 6 (#1)
(W once) Typographical errors often show up as unique variable names.
If you had a good reason for having a unique name, then just mention it
again somehow to suppress the message. The our declaration is
provided for this purpose.

NOTE: This warning detects symbols that have been used only once so $c, @c,
%c, *c, &c, sub c{}, c(), and c (the filehandle or format) are considered
the same; if a program uses $c only once but also uses any of the others it
will not trigger this warning.

Name "main::a" used only once: possible typo at ... line 6 (#1)

分類に"(W once)"とあるので、no warnings qw(once);を加えます。

use 5.016;
use warnings;
no warnings qw(once);
use List::Util qw(reduce);

my $sum = reduce{ $a + $b } (1 .. 5);
say $sum;

20 :名無しさん名前募集中。。。:2013/07/14(日) 22:19:42.57 ID:QmGhmO6n0
2.4 スカラー変数

スカラー変数(scalar variable)は、1個の値を格納します。
スカラー変数の名前は、シジル(sigil)と呼ばれるドル記号($)の後に、
Perl識別子(perl identifier)を置いたものです。

Perl識別子とは、英文字(A-Fa-f)または、アンダースコア(_)で始まり、
英数字(A-Fa-f0-9)またはアンダースコア(_)が任意の数並んだものです。
大文字と小文字は別の文字として扱われます。

2.5.1 スカラ変数を文字列の中に展開する

ダブルクォートで囲まれた文字列リテラルは変数展開(variable interpolation)が
行われます。

perldata - Perl のデータ型 スカラ値のコンストラクタ
http://perldoc.jp/docs/perl/5.16.1/perldata.pod#Scalar32value32constructors
> いくつかのシェルと同じように、変数名の前後に中かっこを入れて、
> つながっている英数字(および下線)から切り離せます。
> 変数を文字列に展開する時に、後に続くコロン 2 つやシングルクォートと
> 変数名を分割する場合にもそうしなければなりません;
> さもなければパッケージのセパレータとして扱われるからです
> $who = "Larry";
> print PASSWD "${who}::0:0:Superuser:/:/bin/perl\n";
> print "We use ${who}speak when ${who}'s here.\n";

21 :名無しさん名前募集中。。。:2013/07/14(日) 22:20:09.89 ID:QmGhmO6n0
2.6 if制御構造

if制御構造(if control structure)はPerlにおける条件分岐構文です。

2.6.1 ブール値

perldata - Perl のデータ型 スカラ値
http://perldoc.jp/docs/perl/5.16.1/perldata.pod#Scalar32values
> スカラ値は、その値が未定義値か空文字列か数値の 0 (あるいは同値な文字列 "0") の
> 場合には、真偽値の偽として扱われ、それ以外のもの全てでは 真として扱われます。
> 真偽値コンテキストは、単に文字列や数値への変換が行われなかった 特別な
> スカラコンテキストとして扱われます。

use 5.016;
use warnings;

foreach(qw(undef 0 0E0 '' '0' 1 '1' '0E0')){
my $v = eval;
say $_, " : ", (length $v ? 0 + $v : ''), " => ", ($v ? "true" : "false");
}

結果
undef : => false
0 : 0 => false
0E0 : 0 => false
'' : => false
'0' : 0 => false
1 : 1 => true
'1' : 1 => true
'0E0' : 0 => true

最後の'0E0'は、数値として評価すれば0を返しますが、
ブール値として評価すれば、文字列なので真を返します。
同じ性質を持つ値として、'0 but true'という文字列が使われることもあります。

22 :名無しさん名前募集中。。。:2013/07/15(月) 15:28:35.84 ID:c7wefAeN0
2.8 chomp演算子

chomp
http://perldoc.jp/func/chomp
> より安全な chop (以下を参照してください) です;
> $/ (English モジュールでは、$INPUT_RECORD_SEPARATOR とも言う) のその時点の
> 値に対応する行末文字を削除します。
> 全ての引数から削除した文字数の合計を返します。

Windows環境の改行コードは"\x0d\x0a"、テキストモードで読まれるときに"\x0a"に修正されます。
Unix環境の改行コードは"\x0a"、テキストモードで読まれるときも"\x0a"です。
Windows環境の改行コードを持ったファイルをUnix環境へそのまま(バイナリのままで)
持ってくると問題が起こるので、何らかの対処が必要です。

use 5.016;
use warnings;
use autodie;
use IO::File;
use Fcntl qw(:seek);

sub report {
my ($fh) = @_;

$fh->seek(0, SEEK_SET);
while(my $line = $fh->getline){
chomp($line);
printf("%0*v2x\n", ',', $line);
}
}

my $fh = IO::File->new_tmpfile;
$fh->binmode;
$fh->print("1\x0a");
$fh->print("2\x0d\x0a");

say ":raw (unix)";
$fh->binmode(':raw');
report($fh);

say ":crlf (windows)";
$fh->binmode(':crlf');
report($fh);

$fh->close;

結果
:raw (unix)
31
32,0d
:crlf (windows)
31
32

23 :名無しさん名前募集中。。。:2013/07/15(月) 15:31:01.26 ID:c7wefAeN0
2.10 未定義値

> まだ値をセットしていないスカラー変数を使うと何が起こるでしょうか?
> 何も深刻なことは起こりませんし、ましてや致命的エラーが発生するわけでもありません。
> 変数は、最初に値を代入されるまでは、特別な値undef(未定義値:undefined balueの意)を
> 持っています。
(初めてのPerl,p.49)

undefは、設定されていない変数を見つけるための特別な値です。
関数が返してきた場合は、失敗したことを示します。
undef値を数値や文字列と混ぜて使わないでください。

値を生成するにはundef関数、検出するにはdefined関数、defined-or演算子を使います。
defined-or演算子は5.10以降のPerlで使えます。

undef
http://perldoc.jp/func/undef

defined
http://perldoc.jp/func/defined
> 左辺値 EXPR が未定義値 undef 以外の値を持つか否かを示す、ブール値を 返します。

perlop - Perl の演算子と優先順位 論理定義性和
http://perldoc.jp/docs/perl/5.16.1/perlop.pod#Logical32Defined-Or
> 普通はこれは defined(EXPR1) ? EXPR1 : EXPR2 と同じ結果になります
> 完全に等価です (例外は 3 項演算子形式は左辺値として使えますが、
> EXPR1 // EXPR2 は使えません)。

use 5.016;
use warnings;

foreach(qw('a' '0' '' undef)){
my $value = eval;

say 'value: ', $_;
say 'defined: ', (defined $value ? 'yes' : 'no');
say 'length: ', (length $value ? length $value : 0);
say 'boolean: ', ($value ? 'true' : 'false');
say '';
}

結果
value: 'a'
defined: yes
length: 1
boolean: true

value: '0'
defined: yes
length: 1
boolean: false

value: ''
defined: yes
length: 0
boolean: false

value: undef
defined: no
length: 0
boolean: false

24 :名無しさん名前募集中。。。:2013/07/16(火) 19:10:36.45 ID:fK0IWD7.0
3 リストと配列

リスト(list)とは、スカラーじの集合に順序を付けて並べたもの。
配列(array)とは、リストを格納する変数。
リストと配列の要素には、0から始まり、1ずつ増加する添え字(index)付けされています。

perldata - Perl のデータ型 リスト値のコンストラクター
http://perldoc.jp/docs/perl/5.16.1/perldata.pod#List32value32constructors

3.3 リストリテラル

リストリテラル(list literal)は、プログラムコードに直接リストを書くための記法です。

use 5.016;
use warnings;

say (1, 2, 3);
say (1, 2, 3,);
say (1, (), (2, 3));
say (1..3);
say (1, 2..3);

結果
123
123
123
123
123

perldata - Perl のデータ型 リスト値のコンストラクター
http://perldoc.jp/docs/perl/5.8.8/perldata.pod#List32value32constructors
> リストの中にリストがある場合には、自動的に展開されてしまいます。
> これは、外側のリストが評価されると、リストの個々の要素がリストコンテキストで
> 評価され、その結果のリスト値の個々の値が、元のリストの要素であるかのように
> 展開されるのです。

> リスト中で空リストを展開しても何も起こりません。 つまり、 ((),(),()) は
> () と等価です。 同様に、要素のない配列を展開することは、その場所に何も
> 展開しなかったのと同じことになります。

25 :名無しさん名前募集中。。。:2013/07/16(火) 19:10:45.30 ID:fK0IWD7.0
範囲演算子(range operator)

perlop - Perl の演算子と優先順位 範囲演算子
http://perldoc.jp/docs/perl/5.16.1/perlop.pod#Range32Operators
> 二項演算子の ".." は範囲演算子で、使われるコンテキストによって
> 異なる動作をする 2 つの演算子を合わせたものです。 リストコンテキストでは、
> 左の値から右の値まで (1 づつ昇順で) 数えあげた値から なるリストを返します。
> 範囲演算子は、マジカル自動インクリメントを使うことで文字列でも動作します

use 5.016;
use warnings;

# say (100000000000000000000 .. 100000000000000000002); # error
say ('0100000000000000000000' .. '0100000000000000000002'); # ok (magical increment)


() 空リスト(empty list/null list)

配列やハッシュを初期化する

perldata - Perl のデータ型 スカラ値
http://perldoc.jp/docs/perl/5.16.1/perldata.pod#Scalar32values
> 配列に空リスト () を代入すると、何も無い状態にまで切り詰められます。
> 以下は等価です:
> @whatever = ();
> $#whatever = -1;

リストコンテキストの強制

perldata - Perl のデータ型 リスト値のコンストラクター
http://perldoc.jp/docs/perl/5.16.1/perldata.pod#List32value32constructors
> 関数の実行や操作の処理をリストコンテキストで行い、
> それからそれを空リストにからすからコンテキストでの代入を行うことで
> 返り値の数を数えるための便利な慣用法のもととなります。
> $count = () = $string =~ /\d+/g;

boolコンテキストでは偽(false)

perlsyn - Perl の文法 真偽値
http://perldoc.jp/docs/perl/5.16.1/perlsyn.pod#Truth32and32Falsehood
> 数値 0, 文字列 '0' と "", 空リスト (), undef は全て真偽値 コンテキストでは
> 偽となります。

26 :名無しさん名前募集中。。。:2013/07/16(火) 19:11:27.50 ID:fK0IWD7.0
3.4 リスト代入
use 5.016;
use warnings;

my ($alpha, $bravo, $charlie) = ('America', 'Bombay', 'China');
say "$alpha $bravo $charlie";

($alpha) = ('America', 'Bombay', 'China');
say $alpha;
$alpha = ('America', 'Bombay', 'China')[0];
say $alpha;

(undef, undef, $charlie) = ('America', 'Bombay', 'China');
say $charlie;
$charlie = ('America', 'Bombay', 'China')[-1];
say $charlie;

($alpha, $charlie) = ('America', 'Bombay', 'China')[0, 2];
say "$alpha $charlie";

結果
America Bombay China
America
America
China
China
America China

27 :名無しさん名前募集中。。。:2013/07/16(火) 19:11:57.72 ID:fK0IWD7.0
3.5 pop演算子とpush演算子
3.5.1 shift演算子とunshift演算子

shift <-- @list <-- push
unshift --> @list --> pop


3.6 splice演算子

使ったら負けかなと思ってる。
頻繁に使うなら、ハッシュ、ツリーなど、他のデータ構造を検討してみてください。

use 5.016;
use warnings;

my @array = qw(alpha bravo charlee charlie delta foxtrot);
say "@array";

splice(@array, 2, 1); # delete
say "@array";

splice(@array, 4, 0, 'echo'); # insert
say "@array";

結果
alpha bravo charlee charlie delta foxtrot
alpha bravo charlie delta foxtrot
alpha bravo charlie delta echo foxtrot


3.7 配列を文字列の中に展開する

ダブルクォート文字列は、配列変数も展開します。
要素の区切りとして、$"変数の内容(通常スペース)を挟みます。

use 5.016;
use warnings;

my @array = (1..3);
say @array;
say "@array";
say "@{[ 1..3 ]}";

結果
123
1 2 3
1 2 3

perlref - Perlのリファレンスとネストしたデータ構造 リファレンスを使う
http://perldoc.jp/docs/perl/5.16.1/perlref.pod#Using32References
> 次の例に示すのは、文字列にサブルーチン呼び出しを埋め込む仕掛けです:
>
> print "My sub returned @{[mysub(1,2,3)]} that time.\n";
>
> ダブルクォートで囲まれた文字列中に @{...} が見つかると、
> その文字列はブロックとして評価されます。 ブロックでは、mysub(1,2,3) の
> 呼び出しを実行し、その結果に対する 無名配列へのリファレンスが作られます。
> つまり、ブロック全体では、配列へのリファレンスを返すこととなり、
> @{...} でデリファレンスされた後、ダブルクォートで囲まれた文字列の中に、
> 埋め込まれることになります。

28 :名無しさん名前募集中。。。:2013/07/16(火) 19:12:19.37 ID:fK0IWD7.0
3.8 foreach制御構造

foreachのリスト部分に式を書いた場合、範囲演算子を除き、演算を行ったのち、
全体を展開します。長さを予測できないデータ(ファイル等)を扱う場合、
whileを使ってください。

perlfaq3 - プログラミングツール 私の Perl プログラムのメモリ消費量を少なくするには?
http://perldoc.jp/docs/perl/5.14.1/perlfaq3.pod#How32can32I32make32my32Perl32program32take32less32memory63

perl5005delta foreach (1..1000000) optimized
http://perldoc.perl.org/perl5005delta.html#foreach-%281..1000000%29-optimized
> foreach (1..1000000) is now optimized into a counting loop.
> It does not try to allocate a 1000000-size list anymore.

3.8.3 sort演算子

sort
http://perldoc.jp/func/sort
> Perl 5.6 以前ではソートの実装にクイックソートアルゴリズムを使っていました。
> このアルゴリズムは安定していないので、2 乗の時間が掛かる 可能性があります。

sort - sort() の振る舞いを制御するための perl プラグマ
http://perldoc.jp/docs/modules/sort-2.01/sort.pod


3.8.4 each演算子

use 5.016;
use warnings;

my @array = ('a' .. 'f');

while(my ($index, $value) = each @array){
say "$index => $value";
}

結果
0 => a
1 => b
2 => c
3 => d
4 => e
5 => f

http://perldoc.jp/func/each
> Perl 5.12 以降でのみ、配列のインデックスと値からなる 2 要素のリストを返すので、
> 反復を行えます;
> Perl 5.14 から、each はスカラの EXPR を取ることができるようになりました;
> これは bless されていないハッシュや配列へのリファレンスでなければなりません。
> 引数は自動的にデリファレンスされます。 each のこの動作は高度に実験的であると
> 考えられています

29 :名無しさん名前募集中。。。:2013/07/18(木) 18:27:05.50 ID:DNwoGUG90
4.2 サブルーチンを起動する

サブルーチンを起動する(subroutine invoke)とは言わず、
サブルーチンを呼び出す(subroutine call)と言います。

事故を防ぐため、&によるサブルーチンコールは使いません。

use 5.016;
use warnings;

my $n = 0;

sub greet {
$n += 1;
say "Hello $n!";
}

greet();
greet();
greet();
greet();

結果
Hello 1!
Hello 2!
Hello 3!
Hello 4!

perlsub - Perl のサブルーチン 説明
http://perldoc.jp/docs/perl/5.16.1/perlsub.pod#DESCRIPTION
> 最近の Perl では & は省略可能であり、サブルーチンがあらかじめ
> 宣言されている場合には括弧も省略できます。

> あるサブルーチンが & 付きで呼び出されたなら、引数リストは省略可能で、
> もし省略されたなら、そのサブルーチンに対して @_ 配列は設定されません:
> 代わりに呼び出し時の @_ 配列がサブルーチンに対して可視となります。

> &foo; # foo() は foo(@_) と同様現在の引数を取る!!

> & 形式は引数リストを省略可能にするばかりでなく、与えられた引数に 対する
> すべてのプロトタイプチェックも無効にします。

30 :名無しさん名前募集中。。。:2013/07/18(木) 18:28:09.95 ID:DNwoGUG90
4.3 戻り値

returnの引数、または最後に評価された式の結果が戻り値として返ります。

perlsub - Perl のサブルーチン 説明
http://perldoc.jp/docs/perl/5.16.1/perlsub.pod#DESCRIPTION
> return がなく、最後の文が式だった場合、その値が返されます。
> 最後の文が foreach や while のようなループ制御構造だった場合、
> 返される値は不定です。 空のサブルーチンは空リストを返します。

return
http://perldoc.jp/func/return
> EXPR が指定されなかった場合は、リストコンテキストでは空リストを、
> スカラコンテキストでは未定義値を返します;
> そして(もちろん) 無効コンテキストでは何も返しません。

要求されているコンテキストで動作を変える

wantarray
http://perldoc.jp/func/wantarray
> 現在実行中のサブルーチンか eval() ブロックのコンテキストが、リスト値を
> 要求するものであれば、真を返します。 スカラを要求するコンテキストであれば、
> 偽を返します。 何も値を要求しない(無効コンテキスト)場合は未定義値を返します。

4.3 戻り値

returnの引数、または最後に評価された式の結果が戻り値として返ります。

perlsub - Perl のサブルーチン 説明
http://perldoc.jp/docs/perl/5.16.1/perlsub.pod#DESCRIPTION
> return がなく、最後の文が式だった場合、その値が返されます。
> 最後の文が foreach や while のようなループ制御構造だった場合、
> 返される値は不定です。 空のサブルーチンは空リストを返します。

return
http://perldoc.jp/func/return
> EXPR が指定されなかった場合は、リストコンテキストでは空リストを、
> スカラコンテキストでは未定義値を返します;
> そして(もちろん) 無効コンテキストでは何も返しません。

要求されているコンテキストで動作を変える

wantarray
http://perldoc.jp/func/wantarray
> 現在実行中のサブルーチンか eval() ブロックのコンテキストが、リスト値を
> 要求するものであれば、真を返します。 スカラを要求するコンテキストであれば、
> 偽を返します。 何も値を要求しない(無効コンテキスト)場合は未定義値を返します。

31 :名無しさん名前募集中。。。:2013/07/18(木) 18:28:50.87 ID:DNwoGUG90
4.4 引数

引数は@_変数にリストとして入れられます。
これらは呼び出し側の変数の別名なので、変更を加えると、元の変数も変更されます。
通常は、サブルーチンの冒頭でmy変数に移し替えます。

perlsub - Perl のサブルーチン 説明
http://perldoc.jp/docs/perl/5.16.1/perlsub.pod#DESCRIPTION
> ルーチンに渡されるすべての引数は配列 @_ に置かれます。 したがって、
> ある関数を二つの引数を付けて呼び出したならば、 その引数は $_[0] と $_[1] に
> 格納されます。 配列 @_ は local 配列ですが、その要素は実際の スカラパラメータの
> 別名です。 たとえば $_[0] が更新された場合、対応する引数が更新されます
> (更新できない場合にはエラーとなります)。

perlsub - Perl のサブルーチン 参照渡し
http://perldoc.jp/docs/perl/5.16.1/perlsub.pod#Pass32by32Reference
> (@a, @b) = func(@c, @d);
> or
> (%a, %b) = func(%c, %d);
> これらの構文は単純にうまくいきません。 戻り値は @aや %aだけにセットされて、
> @b や %b はクリアされます。 それに加え、この関数は引数として二つの配列、
> 二つのハッシュを受け取りません: 受け取るのは常に @_ に格納されている
> (二つの引数の内容が連結された)一つの 長いリストなのです。
> これをリファレンス経由で扱うように変更できるのであれば、見た目はそれ程
> 良くありませんがプログラムを明確にできます。

perldata - Perl のデータ型 リスト値のコンストラクター
http://perldoc.jp/docs/perl/5.16.1/perldata.pod#List32value32constructors
> リスト代入の最後の要素は、配列やハッシュでもかまいません:
> ($a, $b, @rest) = split;
> my($a, $b, %rest) = @_;

use 5.016;
use warnings;

sub rotate_left {
my ($first, @rest) = @_;

return (@rest, $first);
}

say rotate_left(1 .. 5);

結果
23451

32 :名無しさん名前募集中。。。:2013/07/18(木) 18:29:11.37 ID:DNwoGUG90
4.5 サブルーチン内でプライベートな変数

my演算子を使えば、レキシカル変数(lexical variable)と呼ばれる
プライべートな変数を作ることができます。

perlsub - Perl のサブルーチン my() によるプライベート変数
http://perldoc.jp/docs/perl/5.16.1/perlsub.pod#Private32Variables32via32my40
> my 演算子は、それを囲んでいるブロック、条件文 (if/unless/elsif/else)、
> ループ(for/foreach/while/until/continue)、サブルーチン、eval、 あるいは
> do/require/use されたファイルにレキシカルに閉じ込められる 変数を定義します。
> my を使って 宣言されたレキシカル変数はそれを呼び出したサブルーチンも含め、
> 外側の 世界からは秘匿されます。 自分自身が同じサブルーチンを呼んだ場合でさえ
> そうです--個々の呼び出しは それぞれのコピーを所有します。

4.8 use strictプラグマ

strictプラグマは、Perlにいくつかの制限を導入します。
バージョン5.12以降、バージョンナンバーをuseするだけで、strictプラグマも有効になります。

perl5120delta - perl v5.12.0 での変更点 暗黙の strict
http://perldoc.jp/docs/perl/5.12.1/perl5120delta.pod#Implicit32strictures
> バージョン番号 5.11.0 以上を指定した use VERSION 文法を使うと、
> (その他の機能が有効化されるのに追加して) ちょうど use strict と同様、
>レキシカルに strict が有効になります。

4.9.1 アンパーサンドを省略する

事故を防ぐため、組み込み関数と同じ名前のサブルーチンを作ってはいけません。
何等かの理由で組み込み関数を上書き(override)したい場合はsubsプラグマを使います。

perlsub - Perl のサブルーチン 組み込み関数のオーバーライド
http://perldoc.jp/docs/perl/5.16.1/perlsub.pod
> use subs プラグマは import 構文を通して先行宣言を行い、
> さらにそれらの名前が組み込みのものをオーバーライドできるようにします:
> 曖昧さなく組み込みのものを参照するために、特別なパッケージ修飾子 CORE:: を
> 組み込みの名前に前置することができます。

use 5.016;
use warnings;
use subs qw(exit);

sub exit {
say "I won't let you go home tonight.";
}

exit; # !?
CORE::exit; # ok.

結果
I won't let you go home tonight.

33 :名無しさん名前募集中。。。:2013/07/18(木) 18:29:59.91 ID:DNwoGUG90
4.11 永続的なプライベート変数

Perlバージョン5.10以降、バージョンをuseすることで、
永続的な変数を作るstateを使うことができます。

use 5.016;
use warnings;

sub greet {
state $n = 0;
$n += 1;
say "Hello $n!";
}

greet();
greet();
greet();
greet();

state
http://perldoc.jp/func/state
> state はちょうど my と同様に、レキシカルなスコープの変数を宣言します。
> しかし、レキシカル変数がブロックに入る毎に再初期化されるのと異なり、
> この変数は決して再初期化されません。

perlsub - Perl のサブルーチン 永続的なプライベート変数
http://perldoc.jp/docs/perl/5.16.1/perlsub.pod#Persistent32Private32Variables
> perl 5.9.4 から、my の代わりに state キーワードを使って変数を 宣言できます。
> しかし、これを働かせるには、feature プラグマを使うか、一行野郎では -E を
> 使うことで予めこの機能を有効にしなければなりません (feature を参照してください)。
> Perl 5.16 から、CORE::state 形式は feature プラグマが 不要になりました。

feature - 新しい構文上の機能を有効にするプラグマ 暗黙の読み込み
http://perldoc.jp/docs/modules/feature-1.13/feature.pod#IMPLICIT32LOADING
> 以下のようにすると:
> use 5.10.0;
> 暗黙のうちに以下のように:
> use feature ':5.10';
> なるということです。

34 :名無しさん名前募集中。。。:2013/07/18(木) 18:31:13.70 ID:DNwoGUG90
5.1 標準入力からの入力

省略された表記をPerlがどう評価するのかを知る、手っ取り早い方法は、
B::Deparseモジュールを使うことです。

B::Deparse
http://perldoc.perl.org/B/Deparse.html

sub func {
while(<STDIN>){
print;
}
}

use 5.016;
use warnings;
use B::Deparse;

my $deparse = B::Deparse->new('-p');
my $body = $deparse->coderef2text(\&func);
say $body;

結果
{
while (defined(($_ = <STDIN>))) {
print($_);
}
}

35 :名無しさん名前募集中。。。:2013/07/18(木) 18:32:08.37 ID:DNwoGUG90
5.2 ダイヤモンド演算子からの入力

<> ダイヤモンド演算子(diamond operator)

空のダイヤモンド演算子は特殊で、コマンドオプションにある文字列をファイル名として、
順番に読み込みます。コマンドオプションが無ければ、標準入力から読み込みます。

perlop - Perl の演算子と優先順位 I/O 演算子
http://perldoc.jp/docs/perl/5.16.1/perlop.pod#I47O32Operators
> 空のfilehandle <> は特別です: sed、awk、あるいは他のUnixフィルターのように
> ファイル名をリストで取り、各行を処理する振る舞いのエミュレーションに
> 使うことができます。<>からの入力は、標準入力か、コマンドラインに
> リストされたそれぞれのファイルから送られます。
> 動作: 最初<>が評価されると、@ARGV配列がチェックされ、それが空ならば、
> $ARGV[0]が"-"に設定され、オープンされたとき標準入力が与えられます。

5.3 起動引数

起動時のオプションは@ARGVに入ります。

perlvar - Perl で定義済みの変数 ファイルハンドル関連の変数
http://perldoc.jp/docs/perl/5.16.1/perlvar.pod#Variables32related32to32filehandles
> @ARGV
> 配列 @ARGV は、コマンドラインからスクリプトに渡す引数が入れられます。
> $ARGV[0] がプログラムのコマンド名自身ではなく、 最初の引数ですから、
> $#ARGV は一般には、引数の個数 - 1 となります。 コマンド名については、
> "$0" を参照してください。

36 :名無しさん名前募集中。。。:2013/07/18(木) 18:32:35.22 ID:DNwoGUG90
5.4 標準出力への出力

perlfunc - Perl 組み込み関数 説明
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#DESCRIPTION
> 括弧を使うときには、 単純な (しかし、ときには驚く結果となる) 規則が適用できます:
> 関数に見えるならば、それは関数で、優先順位は関係ありません。 そう見えなければ、
> それはリスト演算子か単項演算子で、優先順位が 関係します。 また、関数と
> 開き括弧の間の空白は関係ありませんので、 ときに気を付けなければなりません:

use 5.016;
use warnings;

say 1+2+4; # Prints 7.
say(1+2) + 4; # Prints 3.
say (1+2)+4; # Also prints 3!
say +(1+2)+4; # Prints 7.
say ((1+2)+4); # Prints 7.

結果

標準出力
7
3
3
7
7

標準エラー出力
say (...) interpreted as function at ... line 6.
Useless use of addition (+) in void context at ... line 5.
Useless use of addition (+) in void context at ... line 6.

37 :名無しさん名前募集中。。。:2013/07/18(木) 18:50:12.48 ID:DNwoGUG90
5.6 ファイルハンドル

特殊なファイルハンドル

perlvar - Perl で定義済みの変数 ファイルハンドル関連の変数
http://perldoc.jp/docs/perl/5.16.1/perlvar.pod#Variables32related32to32filehandles
> ARGV
> @ARGV にあるコマンドラインで指定されたファイル名に対して反復する
> 特殊ファイルハンドルです

> ARGVOUT
> -i を使ってその場修正を行っているときに、現在開いている出力ファイルを
> 示す特殊ファイルハンドルです。 たくさんの挿入をする必要があるときに
> $_ を修正し続けたくない場合に 有用です。 -i オプションについては
> perlrun を参照してください。

> __DATA__ 以降のテキストはファイルハンドル PACKNAME::DATA を
> 通して読み出すことができます; ここで PACKNAME は __DATA__ トークンに
> 遭遇した時点でのカレントのパッケージ名です。 ファイルハンドルは
> __DATA__ の後の行を指して開かれたままです。 プログラムはここからデータを
> 読み終わったら close DATA するべきです。

perlglossary
http://perldoc.perl.org/perlglossary.html#S
standard input(標準入力)
あなたのデフォルト入力ストリーム。データがどこから来るのか気にしないこと。
Perlプログラムの中の"ファイルハンドル"ではSTDINであらわされます。

standard ourput(標準出力)
あなたのデフォルト出力ストリーム。データがどこへ行くのか気にしないこと。
Perlプログラムの中のファイルハンドルではSTDOUTであらわされます。

standard error(標準エラー)
標準出力に属さない、汚いコメントをデフォルトで出力するストリーム。
Perlプログラムの中のファイルハンドルではSTDERRであらわされます。
明示的に使えますが、組み込みのdieとwarnは自動的に標準エラーへ書き込みます。

perlopentut - Perl でいろんなものを開くためのチュートリアル STDIN と STDOUT を扱う
http://perldoc.jp/docs/perl/5.16.1/perlopentut.pod#Playing32with32STDIN32and32STDOUT
> STDOUT に関する一つの利口な行動は、プログラムの終了時に 明示的に閉じることです。
> END { close(STDOUT) || die "can't close stdout: $!" }
> これをしないままで、このプログラムがコマンドラインリダイレクトによって
> ディスクをいっぱいにしてしまっても、失敗状態でエラー終了しません。

38 :名無しさん名前募集中。。。:2013/07/18(木) 20:41:55.26 ID:p/LONnpd0
さっきPadreインストールした俺得スレ

39 :名無しさん名前募集中。。。:2013/07/19(金) 20:05:57.94 ID:VDVmXtRV0
いらっしゃい。

書き散らかしてて、すまんの。

40 :名無しさん名前募集中。。。:2013/07/19(金) 20:06:54.70 ID:VDVmXtRV0
5.7 ファイルハンドルをオープンする

perlopentut - Perl でいろんなものを開くためのチュートリアル
http://perldoc.jp/docs/perl/5.16.1/perlopentut.pod

ファイルハンドルの中身

perl5004delta Internal change: FileHandle class based on IO::* classes
http://perldoc.perl.org/perl5004delta.html#Internal-change:-FileHandle-class-based-on-IO::*-classes
> File handles are now stored internally as type IO::Handle.

perl5120delta - perl v5.12.0 での変更点 その他の互換性のなくなる可能性のある変更
http://perldoc.jp/docs/perl/5.12.1/perl5120delta.pod
> ファイルハンドルは常に IO::File に bless されるようになります。

perldelta - perl v5.14.0 での変更点
Filehandle method calls load IO::File on demand
http://perldoc.jp/docs/perl/5.14.0/perl5140delta.pod
> (ファイルハンドルメソッド呼び出しは IO::File をオンデマンドで読み込みます)
> ファイルハンドルへのメソッド呼び出しが、メソッドが解決できないために die し、
> IO::File が読み込まれていない場合、Perl は require 経由で IO::File を
> 読み込んで、もう一度メソッド解決を試みます:

> このオンデマンドの読み込みはメソッド解決が失敗したときにのみ発生するので、
> 部分的なメソッド対応のために IO::File 親クラスを手動で読み込むという
> 伝統的な手法も予想通り動作します

5.7.1 ファイルハンドルに対してbinmodeを適用する

binmode
http://perldoc.jp/func/binmode

STDOUTにUnicodeをUTF-8で出力したい場合。

binmode STDOUT => ':encoding(UTF-8)';

STDOUTにUnicodeをあなたのシステムに合わせて出力したい場合。

Encode::LocaleをCPANから導入します。

Encode::Locale
http://search.cpan.org/~gaas/Encode-Locale-0.04/lib/Encode/Locale.pm

use Encode::Locale;
binmode STDOUT => ':encoding(console_out)';

41 :名無しさん名前募集中。。。:2013/07/19(金) 20:07:59.47 ID:VDVmXtRV0
5.7.3 ファイルハンドルをクローズする

ファイルハンドルに変数を使った場合、変数がスコープを離れ、消去される段階で
自動的にクローズされます。ただし、その場合、closeで発生するエラーを
捉えられません。

perlopentut - Perl でいろんなものを開くためのチュートリアル 間接ファイルハンドル
http://perldoc.jp/docs/perl/5.16.1/perlopentut.pod#Indirect32Filehandles
> 間接ファイルハンドルは、それに対する 参照がなくなったとき、自動的に閉じます:

5.8 dieによって致命的エラーを発生させる

モジュールを作っているのなら、Carpモジュールを使ってください。

Carp - モジュールのための warn と die の代替
http://perldoc.jp/docs/modules/Carp-1.26/lib/Carp.pod

特殊な動作

die
http://perldoc.jp/func/die
> 出力が空で $@ が(典型的には前回の eval で)既に値を持っている場合、
> 値は "\t...propagated" を追加した後再利用されます。
> これは例外を伝播させる場合に有効です:

> 出力が空で、$@ が PROPAGATE メソッドを含むオブジェクトへの リファレンスを
> 含む場合、このメソッドが追加ファイルと行番号を引数として 呼び出されます。
> 返り値は $@ の値を置き換えます; つまり、$@ = eval { $@->PROPAGATE(__FILE__,
> __LINE__) }; が 呼び出されたかのようになります。

> $@ が空の場合、"Died" が使われます。

バージョン5.7.3以降で動作します。

5.8.2 自動的にdieする

autodieプラグマは例外と相性が良いです。

autodie - レキシカルスコープ内の関数を、成功しなければ die するものに置き換える
http://perldoc.jp/docs/modules/autodie-2.06_01/autodie.pod


5.9.1 デフォルトの出力ハンドルを変える

ファイルハンドルを自動的にフラッシュさせたい場合、autoflushメソッドを使ってください。

use IO::File;
FH->autoflush(1);

42 :名無しさん名前募集中。。。:2013/07/19(金) 20:08:09.19 ID:VDVmXtRV0
5.12 ファイルハンドルをスカラー変数に入れる

perlopentut - Perl でいろんなものを開くためのチュートリアル 間接ファイルハンドル
http://perldoc.jp/docs/perl/5.16.1/perlopentut.pod#Indirect32Filehandles
> open の最初の引数は、ファイルハンドルへのリファレンスにすることも出来ます。
> perl 5.6.0 以降、引数が初期化されていない場合、Perl は 以下のように、
> 自動的にファイルハンドルを作成して、それへのリファレンスを 最初の引数に設定します:
> open( my $in, $infile ) or die "Couldn't read $infile: $!";
> while ( <$in> ) {
> # do something with $_
> }
> close $in;

43 :名無しさん名前募集中。。。:2013/07/19(金) 20:08:34.50 ID:VDVmXtRV0
6.1 ハッシュとは?

ハッシュ(hash)。
配列に似ていますが、添え字(index)の代わりに文字列のキー(key)を使い、
スカラ値にアクセスします。

6.2.1 ハッシュ全体を扱う

perldata - Perl のデータ型 リスト値のコンストラクター
http://perldoc.jp/docs/perl/5.16.1/perldata.pod#List32value32constructors
> ハッシュはキーと値と解釈される値のペアとなるリストリテラルを使って 初期化されます:

> key/value のペアの間に => 演算子を使うと読みやすくなります。 => 演算子は実質、
> 見た目に判別しやすいカンマ演算子でありますが、 その左側にあるオペランドが
> 正当な単純な識別子であるような 裸の単語であるときに、それを文字列として
> 解釈するようになっています。
> %map = (
> red => 0x00f,
> blue => 0x0f0,
> green => 0xf00,
> );

6.3.1 keys関数とvalues関数

perl5180delta - perl v5.18.0 での変更点
http://perldoc.jp/docs/perl/5.18.0/perl5180delta.pod
> Perl のハッシュ関数が使う種はランダムになりました。 これは、keys(), values(),
> each() のような関数が返すキー/値の 順序は実行毎に異なるということです。

use strict;
use warnings;

foreach(1..3){
my %hash = (a => 1, b => 2, c => 3);
print keys(%hash), "\n";
print values(%hash), "\n";
}

結果(perl 5.18以前)
cab
312
cab
312
cab
312

結果 例(perl 5.18)
acb
132
abc
123
abc
123

6.4.1 exists関数

use 5.016;
use warnings;

my %hash = (a => undef, b => 0, c => 1);

foreach my $key ('a' .. 'd'){
say $key;
say 'exists: ', (exists $hash{$key} ? 'exists' : 'not exists');
say 'defined: ', (defined $hash{$key} ? 'yes' : 'no');
say 'boolean: ', ($hash{$key} ? 'true' : 'false');
say '';
}

結果
a
exists: exists
defined: no
boolean: false

b
exists: exists
defined: yes
boolean: false

c
exists: exists
defined: yes
boolean: true

d
exists: not exists
defined: no
boolean: false

44 :名無しさん名前募集中。。。:2013/07/19(金) 20:08:50.92 ID:VDVmXtRV0
6.4.2 delete関数

perlfaq4 - データ操作 ハッシュに対する "delete" と "undef"との間の違いは?
http://perldoc.jp/docs/perl/5.14.1/perlfaq4.pod#Whats32the32difference32between32delete32and32undef32with32hashes63

perlsub - Perl のサブルーチン Localized deletion of elements of composite types
http://perldoc.jp/docs/perl/5.16.1/perlsub.pod#Localized32deletion32of32elements32of32composite32types
> 現在のブロックからある複合型エントリを削除してブロックの終了時に復元するために、> delete local $array[$idx] および delete local $hash{key} 構文を使えます。

perl5120delta - perl v5.12.0 での変更点 delete local
http://perldoc.jp/docs/perl/5.12.1/perl5120delta.pod#delete32local
> delete local でハッシュエントリをローカルに削除できるようになりました。

use 5.016;
use warnings;
use Data::Dumper;
local $Data::Dumper::Indent = 0;

my %hash = (a => 1, b => 2, c => 3);
say Dumper(\%hash);

undef $hash{a};
say Dumper(\%hash);

delete $hash{a};
say Dumper(\%hash);

{
delete local $hash{b};
say Dumper(\%hash);
}

say Dumper(\%hash);

結果
$VAR1 = {'c' => 3,'a' => 1,'b' => 2};
$VAR1 = {'c' => 3,'a' => undef,'b' => 2};
$VAR1 = {'c' => 3,'b' => 2};
$VAR1 = {'c' => 3};
$VAR1 = {'c' => 3,'b' => 2};


6.4.3 ハッシュの要素を展開する

ダブルクォート文字列の中でハッシュ全体は展開されません。

6.5 %ENVハッシュ

perlvar - Perl で定義済みの変数 一般変数
http://perldoc.jp/docs/perl/5.16.1/perlvar.pod#General32Variables
> %ENV
> ハッシュ %ENV には、その時点の環境変数が設定されています。
> ENV に値を設定することで、 以後に fork() した子プロセスの環境変数を変更します。

45 :名無しさん名前募集中。。。:2013/07/20(土) 09:55:16.55 ID:58cclHq40
7.1 正規表現とは

正規表現(regular expression)は、Perlでは、しばしばパターン(pettern)と呼ばれ、
照合はパターンマッチング(pattern matching)と呼ばれます。

7.2 単純なパターンを使う

perlretut - Perl の正規表現のチュートリアル
http://perldoc.jp/docs/perl/5.16.1/perlretut.pod

7.2.1 Unicode属性

perlretut - Perl の正規表現のチュートリアル 文字、文字列、文字クラスについての追加事項
http://perldoc.jp/docs/perl/5.16.1/perlretut.pod#More32on32characters44strings44and32character32classes

perlrecharclass - Perl 正規表現文字クラス Unicode 特性
http://perldoc.jp/docs/perl/5.14.1/perlrecharclass.pod#Unicode32Properties
> \pP と \p{Prop} は指定された Unicode 特性に一致する文字に マッチングする
> 文字クラスです。 一文字特性は \pP 形式で、\p に引き続いて特性名です;
> さもなければ 中かっこが必要です。 中かっこを使うとき、単に特性名を
> 中かっこで囲んだ単一形式と、 \p{name=value} のような形で、文字の特性
> "name" が特定の "value" を 持つものにマッチングすることになる複合形式があります

perldelta - perl v5.14.0 での変更点
Most \p{} properties are now immune to case-insensitive matching
http://perldoc.jp/docs/perl/5.14.0/perl5140delta.pod#Most32p123properties32are32now32immune32to32case-insensitive32matching
> (ほとんどの \p{} 特性は大文字小文字なしのマッチングから免除されるようになりました)
> ほとんどの Unicode 特性について、/i 大文字小文字無視オプションの ありなしで
> マッチングが変わるというのは意味がありません。

> \p{} は Unicode の意味論を暗黙に使います
> パターン中に指定された Unicode 特性マッチングは、\N{NAME} と同様、この
> パターンは Unicode ルールに従ってマッチングすることを 意味しているということを
> 示すようになりました。

46 :名無しさん名前募集中。。。:2013/07/20(土) 09:55:35.53 ID:58cclHq40
Unicodeセマンティクス(Unicode semantics)

The 'unicode_strings' feature
http://perldoc.perl.org/feature.html#The-%27unicode_strings%27-feature
> スコープ内で実行される文字列演算にUnicodeセマンティクスを使うことを、
> use faeture 'unicode_strings'でコンパイラに指示します(でなければ、
> 同じくスコープ内で use locale または use bytesいずれかを使います)。

perlunicode - Perl における Unicode サポート「Unicode バグ」
http://perldoc.jp/docs/perl/5.12.1/perlunicode.pod#The32Unicode32Bug
> 「Unicode バグ」("Unicode bug")という用語は、番号が Latin-1 Supplement
> ブロック、つまり 128 から 255 にある Unicode 文字の 非一貫性に対して使われます。
> ロケール指定がない場合、その他の文字や符号位置とは異なり、これらの文字は
> バイトセマンティクスと文字セマンティクスでとても異なったセマンティクスです。

perldelta - perl v5.14.0 での変更点
Full functionality for use feature 'unicode_strings'
http://perldoc.jp/docs/perl/5.14.0/perl5140delta.pod#Full32functionality32for32use32feature32unicode_strings
> (use feature 'unicode_strings' の完全な機能)
> このリリースでは use feature 'unicode_strings' に関する完全な機能が
> 提供されます。 このスコープ内では、全ての文字列操作の処理と正規表現の
> コンパイルは (たとえ実行はスコープ外でも) Unicode の意味論を持ちます。

use 5.016;
use warnings;
use charnames qw(:full);
no feature qw(unicode_strings);

sub report {
my ($title, $func) = @_;

say $title;

foreach(
"a",
"\N{LATIN SMALL LETTER A WITH GRAVE}",
"\xe0",
){
say ($func->($_) ? 'true' : 'false');
}

say '';
}

{
use feature qw(unicode_strings);
report('unicode_strings', sub{ shift =~ /\w/ });
}

{
use bytes;
report('bytes', sub{ shift =~ /\w/ });
}

{
report('default', sub{ shift =~ /\w/ });
}

結果
unicode_strings
true
true
true

bytes
true
false
false

default
true
true
false

47 :名無しさん名前募集中。。。:2013/07/22(月) 18:47:52.52 ID:u2kyfW3g0
perluniprops
http://perldoc.perl.org/perluniprops.html


7.2.2 メタキャラクタ

ドット(.)はワイルドカード文字です。ドットにマッチさせたいなら、"\."と書きます。

7.2.3 単純な量指定子

アスタリスク(*)は0回以上の繰り返しを意味します。
".*"は、任意の文字の0回以上の繰り返しになります。

7.2.4 パターンをグループにまとめる

括弧("()")でパターンをグループにまとめられ、括弧で捉えられたテキストは参照できます。

perlretut - Perl の正規表現のチュートリアル 後方参照
http://perldoc.jp/docs/perl/5.16.1/perlretut.pod#Backreferences
> マッチング変数 $1, $2 …に密接に結び付けられたものは、 後方参照 (backreferences)
> \g1, \g2 …です。 後方参照は正規表現の 内側 で使うことのできるマッチング変数です。

相対後方参照

> より便利なテクニックである相対後方参照が Perl 5.10 で利用可能です。
> 直前の捕捉グループを参照するためには \g{-1} と書き、その手前は \g{-2}、
> などとなります。

名前付き後方参照

> Perl 5.10 では名前付きグループと名前付き後方参照も導入されました。
> 捕捉グループに名前を付けるために、(?<name>...) または (?'name'...) と書けます。
> 後方参照は \g{name} と書けます。

perlvar - Perl で定義済みの変数 正規表現に関する変数
http://perldoc.jp/docs/perl/5.16.1/perlvar.pod#Variables32related32to32regular32expressions
> $<digits> ($1, $2, ...)
> 最後に成功したパターンマッチングで対応する括弧のサブパターンにマッチングした
> 文字列が入っているが、既に抜けてしまったブロックでの パターンマッチングは
> 勘定に入れません。
> これらの変数はすべて読み込み専用で、動的なスコープを持ちます。

> %LAST_PAREN_MATCH
> %+
> @+ と同様、%+ ハッシュは、現在アクティブな動的スコープで最後に成功した
> マッチングの名前付き捕捉バッファ(存在すれば)へのアクセスを可能にします。
> この変数は Perl 5.10 で追加されました。
> この変数は読み込み専用で動的スコープを持ちます。

48 :名無しさん名前募集中。。。:2013/07/22(月) 18:48:08.73 ID:u2kyfW3g0
use 5.016;
use warnings;

$_ = q{'Hello, World!'};

say ((/(["']?)(.*?)\1/)[1]);
say ((/(["']?)(.*?)\g1/)[1]);
say ((/(["']?)(.*?)\g{-2}/)[1]);
say ((/(?<quote>["']?)(.*?)\g{quote}/)[1]);

結果
Hello, World!
Hello, World!
Hello, World!
Hello, World!

49 :名無しさん名前募集中。。。:2013/07/22(月) 18:48:47.12 ID:u2kyfW3g0
7.3 文字クラス

文字クラス(character class)とは、ブラケット([])の間に文字を並べたもの。
そのいずれかにマッチします。

perlretut - Perl の正規表現のチュートリアル 文字クラスを使う
http://perldoc.jp/docs/perl/5.16.1/perlretut.pod#Using32character32classes
> 特殊文字 '-' は文字クラスの中で範囲演算子として振舞います; このため、
> 連続した範囲の文字を一つの範囲として記述することができます。
> 範囲を使うことによって、[0123456789] や [abc...xyz] のような
> 見づらいものはすっきりとした [0-9] であるとか [a-z] のように 書き換えられます。

> '-' が文字クラスの中の最初か最後の文字であった場合、通常の文字として
> 扱われます; [-ab], [ab-], [a\-b] はすべて等価です。

> [0-9] でさえ何回も書くには面倒です; ですから、キーストロークの 数を抑えて、
> かつ正規表現をより読みやすくするために後述するように Perl は 一般的な文字クラスの
> 略記法を持っています。 Unicode の導入のために、//a 修飾子が有効でない限り、
> これらの文字クラスは ASCII の範囲での数文字よりも多くマッチングします。
> \d は数字にマッチングします; 単に [0-9] だけではなく、非ローマ字
> スクリプトからの数字もマッチングします

> Perl 5.14 から利用可能の //a 修飾子は、\d, \s, \w を ASCII の範囲に
> 制限するために使います。 これは、英語風のテキストを処理したいだけの時に
> プログラムを不必要に 完全な Unicode (とそれに関連するセキュリティの配慮) に
> さらされないように するのに有用です。

use 5.016;
use warnings;

foreach(
"0",
"\x{ff10}", # FULLWIDTH DIGIT ZERO
"\x{4e00}", # CJK Ideograph First
){
say (/\d/ ? 'true' : 'false');
}

結果
true
true
false

50 :名無しさん名前募集中。。。:2013/07/22(月) 18:49:10.68 ID:u2kyfW3g0
perlrebackslash - Perl 正規表現逆スラッシュシーケンスとエスケープ その他
http://perldoc.jp/docs/perl/5.16.1/perlrebackslash.pod#Misc
> \R
> \R は 一般的な改行 にマッチングします; これは Unicode で改行並びとして
> 扱われるものです。 これには \v (垂直空白) でマッチングする全ての文字、
> 複数文字並び "\x0D\x0A" (復帰に引き続いて改行、時々ネットワーク改行と
> 呼ばれるもの; これは Microsoft テキストファイルをバイナリモードで開いた時に
> 使われる 行末並びです) を含みます。 \R は (?>\x0D\x0A)|\v) と等価です。
> \R は perl 5.10.0 で導入されました。

> "\n" =~ /^\R$/; # Match, \n is a generic newline.
> "\r" =~ /^\R$/; # Match, \r is a generic newline.
> "\r\n" =~ /^\R$/; # Match, \r\n is a generic newline.

51 :名無しさん名前募集中。。。:2013/07/22(月) 18:50:11.28 ID:u2kyfW3g0
8.1 m//を使ってマッチを行う

perlop - Perl の演算子と優先順位 正規表現のクォート風の演算子
http://perldoc.jp/docs/perl/5.16.1/perlop.pod#Regexp32Quote-Like32Operators

> m/PATTERN/cgimosx
> /PATTERN/cgimosx
> パターンマッチで文字列検索を行ない、スカラコンテキストでは成功したときは真、
> 失敗したときは偽を返します。 =~ 演算子か !~ 演算子で検索対象の文字列を
> 示さなかったときには、 $_ の文字列が検索対象となります。

> 区切文字が "/" のときには、最初の m は付けても付けなくてもかまいません。
> m を付けるときには、英数字でも空白でもない、任意の文字のペアを 区切文字として
> 使うことができます。 これは "/" を含むパス名にパターンパッチを行なうときに
> 便利でしょう。 LTS (楊枝偏執症候群) を避けるためにも。 "'" がデリミタの場合、
> PATTERN に対する展開は行われません。

> PATTERN には、変数が含まれていてもよく、パターンが評価されるごとに、
> (デリミタがシングルクォートでない限り) 変数は展開され (パターンが
> 再コンパイルされ) ます。 (変数 $(, $), $| は文字列の終わりを調べる
> パターンであると 解釈されるので、展開されません。)

52 :名無しさん名前募集中。。。:2013/07/22(月) 18:53:04.60 ID:u2kyfW3g0
8.2 マッチ修飾子

perlop - Perl の演算子と優先順位 正規表現のクォート風の演算子
http://perldoc.jp/docs/perl/5.16.1/perlop.pod#Regexp32Quote-Like32Operators

8.2.1 大文字と小文字を区別せずにマッチする:/i

perldelta - perl v5.14.0 での変更点 反転させた大かっこ文字クラスと複数文字の折り畳み
http://perldoc.jp/docs/perl/5.14.0/perl5140delta.pod#Inverted32bracketed32character32classes32and32multi-character32folds

> (反転させた大かっこ文字クラスと複数文字の折り畳み)
> いくつかの文字は、Unicode ルールでの "/i" 正規表現マッチングでは 2 また
> は 3 文字の並びにマッチングします。 一つの例としては、"LATIN SMALL
> LETTER SHARP S" は "ss" という並びに マッチングします。
> 'ss' =~ /\A[\N{LATIN SMALL LETTER SHARP S}]\z/i # Matches

> しかしこれは、特に反転させたときに、とても非直観的な結果を導いていまし
> た。 これにより、Perl 5.14 は反転させた文字クラスでの複数文字の "/i" マ
> ッチングを使わなくなりました。

> 'ss' =~ /\A[^\N{LATIN SMALL LETTER SHARP S}]+\z/i # ???

> これは、"SHARP S" や、"/i" の元で "SHARP S" にマッチングしないあらゆる
> 文字の並びにマッチングするべきです。 "s" は "SHARP S" ではありませんが
> 、Unicode は "/i" の元では "ss" は "SHARP S" にマッチングするとしていま
> す。 そこで、どちらが「勝つ」べきでしょうか? 文字列に "ss" があるという
> 理由でマッチングは失敗するでしょうか、それとも 一つの "s" に匹津津井で
> 一つの "s" があるので成功するでしょうか?

53 :名無しさん名前募集中。。。:2013/07/22(月) 18:53:32.57 ID:u2kyfW3g0
use 5.016;
use warnings;
use charnames qw(:full);

# test eszett

foreach(
'\N{LATIN CAPITAL LETTER SHARP S}',
'\N{LATIN SMALL LETTER SHARP S}',
'ss',
'SS',
){
say;
my $c = eval qq{"$_"};
say ($c =~ /\A[\N{LATIN CAPITAL LETTER SHARP S}]+\z/i ? 'true' : 'false');
say ($c =~ /\A[^\N{LATIN CAPITAL LETTER SHARP S}]+\z/i ? 'true' : 'false');
say ($c =~ /\Ass\z/i ? 'true' : 'false');
say ($c =~ /\Ass\z/ai ? 'true' : 'false');
say ($c =~ /\Ass\z/aai ? 'true' : 'false');
say '';
}

結果
\N{LATIN CAPITAL LETTER SHARP S}
true
false
true
true
false

\N{LATIN SMALL LETTER SHARP S}
true
false
true
true
false

ss
true
true
true
true
true

SS
true
true
true
true
true

54 :名無しさん名前募集中。。。:2013/07/22(月) 18:57:40.52 ID:u2kyfW3g0
8.2.5 文字の解釈を選択する

perlre Modifiers
http://perldoc.perl.org/perlre.html#Modifiers
> Briefly, /l sets the character set to that of whatever Locale is in effect
> at the time of the execution of the pattern match.
> /u sets the character set to Unicode.
> /a also sets the character set to Unicode, BUT adds several restrictions
> for ASCII-safe matching.
> /d is the old, problematic, pre-5.14 Default character set behavior.
> Its only use is to force that old behavior.

use 5.016;
use warnings;
no feature qw(unicode_strings);

foreach(
'a',
'\xe0',
'\x{0178}',
){
say;
my $c = eval qq{"$_"};
say ($c =~ /\w/d ? 'true' : 'false');
say ($c =~ /\w/a ? 'true' : 'false');
say ($c =~ /\w/u ? 'true' : 'false');
say ($c =~ /\w/l ? 'true' : 'false');
say '';
}

結果
a
true
true
true
true

\xe0
false
false
true
false

\x{0178}
true
false
true
true

55 :名無しさん名前募集中。。。:2013/07/22(月) 19:17:12.51 ID:u2kyfW3g0
日本語処理するだけなら、この辺は突っ込まなくても。

要約:
\w,\d,\sは、Unicodeの文字もマッチするので、
ASCII文字だけにマッチさせたいなら/a修飾子を付けると安全です。

56 :名無しさん名前募集中。。。:2013/07/22(月) 20:55:52.40 ID:u2kyfW3g0
8.3 アンカー

\b 単語の境界
\B 単語の境界では無いところ
\A 文字列先頭
\Z 文字列末尾(または、末尾の改行の前)
\z 文字列末尾

perlre - Perl 正規表現 言明
http://perldoc.jp/docs/perl/5.14.1/perlre.pod#Assertions
> \b Match a word boundary
> \B Match except at a word boundary
> \A Match only at beginning of string
> \Z Match only at end of string, or before newline at the end
> \z Match only at end of string

perlre - Perl 正規表現 メタ文字
http://perldoc.jp/docs/perl/5.14.1/perlre.pod#Metacharacters
> ^ 行の先頭にマッチング
> $ 行の終端にマッチング(または終端の改行の前)

perlre - Perl 正規表現 修飾子
http://perldoc.jp/docs/perl/5.14.1/perlre.pod#Modifiers
> m
> 文字列を複数行として扱います。 つまり、"^" 及び "$" は文字列の最初と最後に
> 対するマッチングから、 文字列中の各行の先頭と末尾に対するマッチングへと
> 変更されます。
> s
> 文字列を 1 行として扱います。 つまり、"." は任意の 1 文字、通常はマッチングしない
> 改行でさえも マッチングするように変更されます。

> /ms として共に使うと、"^" 及び "$" はそれぞれ 文字列中の改行の直前及び直後の
> マッチングでありつつ、"." は任意の文字に マッチングするようになります。

57 :名無しさん名前募集中。。。:2013/07/22(月) 20:56:21.75 ID:u2kyfW3g0
8.4 結合演算子 =~

結合演算子(=~)は、その右側にあるパターンを、左側の文字列にマッチさせます。
省略すると$_が適用されます。

罠1: $source = /foo/; の解釈は $source = ($_ =~ m/foo/);
罠2: $source = ~ /foo/; の解釈は $source = (~($_ =~ m/foo/));
罠3: my $copy = $source =~ s/foo//; の解釈は my $copy = ($source =~ s/foo//);

perltrap - 不注意による Perl の罠 Perl の罠
http://perldoc.jp/docs/perl/5.16.1/perltrap.pod
> =~ が必要なところで = を使わない、ということを忘れないでください;
> これら二つの構造はかなり違います:
> $x = /foo/;
> $x =~ /foo/;

58 :名無しさん名前募集中。。。:2013/07/23(火) 18:59:39.71 ID:RpxHE7560
8.6 マッチ変数

perlvar - Perl で定義済みの変数 正規表現に関する変数
http://perldoc.jp/docs/perl/5.16.1/perlvar.pod#Variables32related32to32regular32expressions

8.6.1 キャプチャの有効期限

キャプチャした変数の値は、パターンマッチに失敗した場合、
前のパターンマッチの結果が残ったままなので注意が必要です。

マッチしたときだけ処理する。

if (/(\w+) (\d+)/){
my ($word, $digits) = ($1, $2);
...
}

while(/(\w+)/g){
my $word = $1;
...
}

8.6.2 キャプチャなしのカッコ

グループ化は必要でも、キャプチャが不要な時に使います。

perlre - Perl 正規表現 拡張パターン
http://perldoc.jp/docs/perl/5.14.1/perlre.pod#Extended32Patterns
> "(?:pattern)"
> "(?adluimsx-imsx:pattern)"
> "(?^aluimsx:pattern)"
> これはキャプチャではなくクラスタです; これは "()" のように部分式を
> グループ化しますが "()" が行うような後方参照は行いません。

59 :名無しさん名前募集中。。。:2013/07/23(火) 19:00:03.16 ID:RpxHE7560
8.6.4 自動マッチ変数

効率も悪く、使わないのがお約束です。
必要なら、カッコを使ってキャプチャするか、/p修飾子を使います。

perlre - Perl 正規表現 捕捉グループ
http://perldoc.jp/docs/perl/5.14.1/perlre.pod#Capture32groups
> 警告: Perl は、一旦プログラム中のどこかで $&, $`, $' の いずれかを
> 必要としていることを見つけると、全てのパターンマッチングで それらを
> 提供しなければなりません。 これはあなたのプログラムを大幅に
> 遅くさせるでしょう。

> この問題に対する解決策として、Perl 5.10.0 からは $`, $&, $' と
> 等価だけれども /p (preseve) 修飾子を伴って実行されたマッチングが
> 成功した後でのみ定義されることが保証される ${^PREMATCH}、 ${^MATCH} 及び
> ${^POSTMATCH} を導入しました。


8.7 汎用の量指定子

perlre - Perl 正規表現 量指定子
http://perldoc.jp/docs/perl/5.14.1/perlre.pod#Quantifiers

> 以下の標準的な量指定子を使えます:
> * Match 0 or more times
> + Match 1 or more times
> ? Match 1 or 0 times
> {n} Match exactly n times
> {n,} Match at least n times
> {n,m} Match at least n but not more than m times

use 5.016;
use warnings;

# banana problem

foreach(qw(
banana
bananana
banananana
ba
bana
bananan
)){
if (/^ba(?:na){2,}$/){
say $_, ": yes, banana!";
}
}

結果
banana: yes, banana!
bananana: yes, banana!
banananana: yes, banana!

60 :名無しさん名前募集中。。。:2013/07/23(火) 19:00:54.63 ID:RpxHE7560
9.1 s///を使って置換を行なう

use 5.016;
use warnings;

$_ = "Say it ain't so, Joe!";

s/Joe/Bernie/;
say;

結果
Say it ain't so, Bernie!

perlop - Perl の演算子と優先順位 正規表現のクォート風の演算子
http://perldoc.jp/docs/perl/5.16.1/perlop.pod#Regexp32Quote-Like32Operators

> s/PATTERN/REPLACEMENT/msixpodualgcer
> 文字列中でパターンを検索し、もし見つかれば、置換テキストで置き換え、
> 置換した数を返します。 見つからなければ、偽 (具体的には、空文字列) を返します。
> /r (非破壊) オプションが使われると、文字列のコピーに対して置換が行われ、
> 置換された数ではなく、置換が行われたかどうかにかかわらずこのコピーが
> 返されます。 /r が使われた場合、元の文字列は決して変更されません。
> コピーは、たとえ入力がオブジェクトや tie された変数でも、常に
> プレーンな文字列です。

perlop - Perl の演算子と優先順位 拘束演算子
> 二項演算子の "!~" を非破壊置換 (s///r) や変換 (y///r) で使うと
> 文法エラーとなります。

/rを使うと式に組み込みやすくなるので、高階関数と相性が良いです。

use 5.016;
use warnings;

my ($source, $copy);

$source = 'Hello, World!';
$copy = $source =~ s/World/Perl/;
say $copy;

$source = 'Hello, World!';
$copy = $source =~ s/World/Perl/r;
say $copy;

結果
1
Hello, Perl!

9.1.1 /gによるグローバルな置換

s///gで可能な限り全てを置き換えます。

61 :名無しさん名前募集中。。。:2013/07/23(火) 19:05:13.55 ID:RpxHE7560
9.2 split演算子

split
http://perldoc.jp/func/split
> split /PATTERN/,EXPR,LIMIT
> split /PATTERN/,EXPR
> split /PATTERN/
> split
> 文字列 EXPR を文字列のリストに分割して、リストコンテキストではそのリストを
> 返し、スカラコンテキストではリストの大きさを返します。
> PATTERN のみが与えられた場合、EXPR のデフォルトは $_ です。

use 5.016;
use warnings;

$_ = ' a b c ';
say join(':', split);
say join(':', split ' ');
say join(':', split / /);
say '';
$_ = '1,2,3,,';
say join(':', split /,/);
say join(':', split /,/, $_, 2);
say join(':', split /,/, $_, -1);
say '';

結果
a:b:c
a:b:c
::a::b:c

1:2:3
1:2,3,,
1:2:3::

62 :名無しさん名前募集中。。。:2013/07/23(火) 19:05:31.91 ID:RpxHE7560
use 5.016;
use warnings;

# line count ...?

$_ = <<'EOF';
a
b
c

EOF

say scalar split /^/;
say scalar split /$/m;
say scalar split /\n/;
say scalar split /\n/, $_, -1;

結果
4
5
3
5

63 :名無しさん名前募集中。。。:2013/07/23(火) 19:16:10.18 ID:RpxHE7560
コピペして、今更ながら、スペースが潰れるのを思い出した……。

$_ = ' a b c ';

($_ = '..a..b.c..') =~ s/\./ /g;

64 :名無しさん名前募集中。。。:2013/07/24(水) 19:00:31.20 ID:usP7rrSD0
9.3 join関数

join

> join EXPR,LIST
> LIST の個別の文字列を、EXPR の値で区切って 1 つの文字列につなげ、
> その文字列を返します。
> "split" と違って、"join" は最初の引数にパターンは取れないことに
> 注意してください。 "split" と比較してください。

use 5.016;
use warnings;

my @array = ('a' .. 'c');

say join('', @array);
say join('..', @array);

say join(/^/, @array); # say join(scalar($_ =~ /^/), @array);

結果
abc
a..b..c
a1b1c

標準エラー出力
/^/ should probably be written as "^" at ... line 9.
Use of uninitialized value $_ in pattern match (m//) at ... line 9.

65 :名無しさん名前募集中。。。:2013/07/24(水) 19:01:41.13 ID:usP7rrSD0
9.4 m//をリストコンテキストで使う

perlop - Perl の演算子と優先順位 正規表現のクォート風の演算子
http://perldoc.jp/docs/perl/5.16.1/perlop.pod#Regexp32Quote-Like32Operators

> /gオプションが使われなかった場合、リストコンテキストでのm//は
> パターンの中の括弧で括られた部分列にマッチしたもので構成されるリストを
> 返します。 これは、($1, $2, $3, ...) ということです。 (この場合、
> $1 なども設定されます。 この点で Perl 4 の動作と違っています。)
> パターンに括弧がない場合は、返り値は成功時はリスト (1) です。
> 括弧のあるなしに関わらず、失敗時は空リストを返します。

> /g 修飾子は、グローバルなパターンマッチを指定するもので、 文字列の中で
> 可能な限りたくさんマッチを行ないます。 この動作は、コンテキストに依存します。
> リストコンテキストでは、正規表現内の括弧付けされたものにマッチした
> 部分文字列のリストが返されます。 括弧がなければ、パターン全体を
> 括弧で括っていたかのように、 すべてのマッチした文字列のリストが返されます。

リストコンテキストを使うと以下のように書けるようになりますが、
スカラコンテキストが使われることが多いので、あまり見かけないように思います。

if (my ($word, $digits) = /(\w+) (\d+)/){
...
}

9.5.1 欲張りでない量指定子

perlre - Perl 正規表現 量指定子
http://perldoc.jp/docs/perl/5.14.1/perlre.pod#Quantifiers
> デフォルトでは、パターンで行われる量指定は"貪欲"です; つまりそれは
> パターンの残りの部分が可能な範囲で、 (始めた地点から)可能な限り多くを
> 先にあるパターンでマッチングさせます。 もし最小回数でのマッチングを
> 行いたいのであれば、量指定子の後ろに "?" を続けます。
> 意味は変更されずに「貪欲さ」だけを変更できます:

> *? 0 回以上の貪欲でないマッチング
> +? 1 回以上の貪欲でないマッチング
> ?? 0 回または 1 回の貪欲でないマッチング
> {n}? ちょうど n 回の貪欲でないマッチング (冗長)
> {n,}? n 回以上の貪欲でないマッチング
> {n,m}? n 回以上 m 回以下の貪欲でないマッチング

66 :名無しさん名前募集中。。。:2013/07/24(水) 19:04:09.90 ID:usP7rrSD0
10.1 unless制御構造

偽の時にコードブロックを実行するif。
else節を伴う場合、ifに書き直します。

10.2 until制御構造

偽の時にコードブロックを実行するwhile。
使いません。

10.3 式修飾子

文修飾子(statement modifier)。

perlsyn - Perl の文法 文修飾子
http://perldoc.jp/docs/perl/5.16.1/perlsyn.pod#Statement32Modifiers
> 任意の単純文には、一つ の修飾子を終端のセミコロンの直前(もしくは
> ブロックの終端の直前)に付けることができます。 使うことのできる修飾子は
> 以下の通りです。

> if EXPR
> unless EXPR
> while EXPR
> until EXPR
> for LIST
> foreach LIST
> when EXPR

> 修飾子に引き続く EXPR は「条件」として参照されます。
> その真偽値が修飾子の振る舞いを決定します。

> 注意: (my $x if ... のような) 条件構造やループ構造で修飾された
> my state,our 文の振る舞いは 未定義 です。 my 変数の値は undef かも
> 知れませんし、以前に代入された値かも 知れませんし、その他の如何なる値の
> 可能性もあります。 この値に依存してはいけません。

そのままでは警告さえも出ませんが、perlcriticで検出可能です。

use 5.016;
use warnings;
use Perl::Critic qw(critique);

print critique($0);

my $v = 0xDEAD if 0;
say $v // '(undef)'; # !?

結果(例)
Variable declared in conditional statement at line 7, column 1. Declare variables outside of the condition.
(undef)

(プログラムに埋め込みましたが、通常はコマンドラインかテストモジュールから
perlcriticを使います)。

67 :名無しさん名前募集中。。。:2013/07/24(水) 19:06:59.75 ID:usP7rrSD0
10.4 裸のブロック構造

主に、レキシカルスコープを提供するために使います。

10.5 オートインクリメント

C言語のオートインクリメント、デクリメントと同じようにふるまいます。

perlop - Perl の演算子と優先順位 インクリメントとデクリメント
http://perldoc.jp/docs/perl/5.16.1/perlop.pod#Auto-increment32and32Auto-decrement
> C と同様、Perl は いつ 変数がインクリメントまたはデクリメントされるかは
> 定義されません。 値が返される前か後のどこかで行われる、
> ということだけがわかります。 これは、同じ文である変数を 2 回修正すると、
> 振る舞いが未定義になることを 意味します。 以下のような文は避けてください:

> $i = $i ++;
> print ++ $i + $i ++;


10.7.1 foreachとforの秘められた関係

perlsyn - Perl の文法 foreach ループ
http://perldoc.jp/docs/perl/5.16.1/perlsyn.pod#Foreach32Loops
> foreach は実際には for の同義語なので、どちらでも使えます。

Cスタイルのfor(;;)は避けましょう。

68 :名無しさん名前募集中。。。:2013/07/24(水) 19:07:54.43 ID:usP7rrSD0
10.8 ループを制御する

do - while の罠

perlsyn - Perl の文法 基本ブロック
http://perldoc.jp/docs/perl/5.16.1/perlsyn.pod#Basic32BLOCKs
> ブロックから脱出するためやブロックの再スタートのために 任意のループ制御文を
> 使うことができます。 (これは eval{}、sub{}、 さらに一般的な認識とは異なり
> ループではない do{} ブロックに対しては 真ではない ということに
> 注意してください。)

perlsyn - Perl の文法 文修飾子
http://perldoc.jp/docs/perl/5.16.1/perlsyn.pod#Statement32Modifiers
> 後述するループの制御文は、修飾子がループラベルを取らないために
> この構造文では 動作しない ということにも注意してください。 申し訳ない。
> こういった場合に対処するのに別のブロックを内側に入れたり(next の場合)、
> 別のブロックで囲む(last の場合)という方法が常に使えます。

> do {{
> next if $x == $y;
> # do something here
> }} until $x++ > $z;

>last の場合は、もっと念入りにする必要があります:

> LOOP: {
> do {
> last if $x = $y**2;
> # do something here
> } while $x++ <= $z;
> }

更に、do{}while();形式では、doブロックで作成された変数をwhileの評価式では使えません。

69 :名無しさん名前募集中。。。:2013/07/24(水) 19:08:10.95 ID:usP7rrSD0
perlsyn - Perl の文法 複合文
http://perldoc.jp/docs/perl/5.16.1/perlsyn.pod#Compound32Statements
> LABEL while (EXPR) BLOCK
> LABEL while (EXPR) BLOCK continue BLOCK

> LABEL until (EXPR) BLOCK
> LABEL until (EXPR) BLOCK continue BLOCK

> LABEL for (EXPR; EXPR; EXPR) BLOCK
> LABEL for VAR (LIST) BLOCK
> LABEL for VAR (LIST) BLOCK continue BLOCK

> LABEL foreach (EXPR; EXPR; EXPR) BLOCK
> LABEL foreach VAR (LIST) BLOCK
> LABEL foreach VAR (LIST) BLOCK continue BLOCK

> LABEL BLOCK
> LABEL BLOCK continue BLOCK

特殊なブロック

perlmod - Perl のモジュール (パッケージとシンボルテーブル)
BEGIN, UNITCHECK, CHECK, INIT, END
http://perldoc.jp/docs/perl/5.16.1/perlmod.pod#BEGIN44UNITCHECK44CHECK44INIT32and32END
> 5 つの特殊な名前のついたコードブロックは、Perl プログラムの開始時および
> 終了時に実行されます。 それは BEGIN, UNITCHECK, CHECK, INIT, END ブロックです。

70 :名無しさん名前募集中。。。:2013/07/24(水) 19:10:48.54 ID:usP7rrSD0
10.10 論理演算子

perlop - Perl の演算子と優先順位 論理積
http://perldoc.jp/docs/perl/5.16.1/perlop.pod#Logical32And
> 二項演算子の "and" は両側の式の論理積を返します。 これは、優先順位が
> ずっと低いことを除けば && と等価です。 つまり、これも短絡演算を行ない、
> 右側の式は左側の式が 「真」であった場合にのみ評価されます。

perlop - Perl の演算子と優先順位 論理和と排他論理和
http://perldoc.jp/docs/perl/5.16.1/perlop.pod#Logical32or32and32Exclusive32Or
> 二項演算子の "or" は両側の式の論理和を返します。 これは、優先順位が
> ずっと低いことを除いて || と等価です。 これはフローを制御するのに有用です:

> print FH $data or die "Can't write to FH: $!";

> つまり、これも短絡演算を行ない、右側の式は左側の式が 「偽」であった
> 場合にのみ評価されます。 優先度の関係で、これを || 演算子の置き換えに
> 使うのは慎重に 避けなければなりません。

10.10.3 部分評価演算子を使って制御構造を実現する

左項の評価結果によって、右項を評価するかどうかが決まる演算は、
短絡演算(short-circuit evaluation)と呼ばれたり、演算子が
部分評価演算子(partial-evaluation operator)と呼ばれたりします。

... or die;
... or next;

などの制御を行う部分で使います。

71 :名無しさん名前募集中。。。:2013/07/24(水) 23:33:58.87 ID:JewgDfrr0
Rubyスレは無いですかそうですか

72 :名無しさん名前募集中。。。:2013/07/25(木) 19:14:21.55 ID:WhVb7wVz0
>>71
まあ、立ててみては?

73 :名無しさん名前募集中。。。:2013/07/25(木) 19:36:50.55 ID:WhVb7wVz0
11.1 モジュールを探す

search CPAN http://search.cpan.org/
Meta CPAN https://metacpan.org/

11.2 モジュールをインストールする

perlfaq8 - システムとの相互作用 モジュールを CPAN からインストールするには?
http://perldoc.jp/docs/perl/5.14.1/perlfaq8.pod#How32do32I32install32a32module32from32CPAN63
> 最も単純な方法は、Perl と同梱されている cpan コマンドを使って、
> この仕事を してくれる CPAN モジュールを入手することです。
> インストールするモジュールの一覧を与えます:
>
> $ cpan IO::Interactive Getopt::Whatever

> 全ての依存を自分で解決して、配布を自分自身でインストールしてみたい場合は、
> 二つのビルド方法のどちらかに従います。
> Makefile.PL を使う配布では:
>
> $ perl Makefile.PL
> $ make test install
>

> 一部の配布ではBuild.PL を使う配布では:
>
> $ perl Build.PL
> $ ./Build test
> $ ./Build install

> ライブラリはその他のサードパーティのコードへのリンクが
> 必要であったり、ビルドとインストールの手順がもっと複雑な場合もあります。
> 見付かった README や INSTALL ファイルをチェックしてください。

cpan
http://perldoc.perl.org/cpan.html

cpanm

App::cpanminus
http://search.cpan.org/~miyagawa/App-cpanminus-1.6932/lib/App/cpanminus.pm

注意: cpanmはhttpsを使ってダウンロードされると思います。
httpsを通すようにファイアーウォールを調整しておく必要があります。

perlbrewを入れている場合、install-cpanmコマンドでインストール可能です。

74 :名無しさん名前募集中。。。:2013/07/25(木) 20:21:04.48 ID:WhVb7wVz0
11.3.1 File::Basenameモジュール

使う
use File::Basename;

File::Basenameをロードすると同時に、いくつかの関数もインポートされ、使えるようになります。
作成しているプログラムのサブルーチン名と被るのを避けるには、関数のインポートを止め、
File::Basenameに含まれる関数を呼び出すために、完全修飾名(fully qualified name)で
呼び出すようにします。

use 5.016;
use warnings;
use File::Basename ();

sub dirname { '/mydir' }

my $name = '/foo/bar/baz/qux';
say File::Basename::dirname $name;
say dirname $name;

結果
/foo/bar/baz
/mydir

basename関数だけをインポートしたいときは
use File::Basename qw(basename);


11.3.3 File::Specモジュール

File::Specモジュールでは、クラスメソッドを呼び出す形式で使います。
呼び出し方は、クラス名->メソッド名です。

use 5.016;
use warnings;
use File::Basename qw(basename dirname);
use File::Spec;

my $name = '/foo/bar/baz/qux';
my $dir = dirname $name;
my $base = basename $name;
say File::Spec->catfile($dir, $base);

結果(例:windows環境)
\foo\bar\baz\qux

なお、関数をインポートする形式のFile::Spec::Funcitonsモジュールもあります。

75 :名無しさん名前募集中。。。:2013/07/25(木) 20:47:04.21 ID:WhVb7wVz0
11.3.4 Path::Class

Path::Classは、File::Specより、少しスマートなモジュールです。

use 5.016;
use warnings;
use Path::Class;

my $path = file '/foo/bar/baz/qux';
my $dir = $path->dir;
my $base = $path->basename;
say $dir;
say $base;

結果(例:windows環境)
\foo\bar\baz
qux

Path::Classのfile関数は、Path::Class::Fileのオブジェクトを返します。
そのため、ドキュメントを調べるときは、Path::Class::Fileを参照します。

Path::Class::File
http://search.cpan.org/~kwilliams/Path-Class-0.32/lib/Path/Class/File.pm

76 :名無しさん名前募集中。。。:2013/07/26(金) 20:21:13.99 ID:ijdGhvr80
11.3.5 CGI.pm

CGI.pmモジュールは、少々時代遅れになりましたが、CGI周りの雑事を一手に引き受ける
便利なモジュールです。
オブジェクト指向でも、関数形式でも使えます。
ただ、大量の関数を抱え込んでいるため、関数単位でのインポートが困難です。
そのため、タグ形式による複数の関数をまとめてインポートする方法をサポートしています。

use 5.016;
use warnings;
use CGI qw(:all);

my @list = ('foo', 'bar', 'baz');

print header(-charset => 'utf-8');
print start_html(-title => 'CGI test', -lang => '');

print h1('CGI test.'), "\n";
print ul(li(\@list));

print end_html;

結果
Content-Type: text/html; charset=utf-8

<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>CGI test</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h1>CGI test.</h1>
<ul><li>foo</li> <li>bar</li> <li>baz</li></ul>
</body>
</html>

77 :名無しさん名前募集中。。。:2013/07/26(金) 20:28:12.27 ID:ijdGhvr80
11.3.6 データベースとDBI

DBIは全てをコントロールできる反面、コード量が増えてしまいます。

SQLite3は、サーバではなく、ライブラリの形で提供され、更にメモリ上に
デーブルを作ることができるので、実験向きです。

use 5.016;
use warnings;
use DBI;

my $dbh = DBI->connect(
'DBI:SQLite:dbname=:memory:',
'',
'',
{
RaiseError => 1,
AutoCommit => 0,
sqlite_unicode => 1,
}
) or die $DBI::errstr;
...

$dbh->disconnect;

78 :名無しさん名前募集中。。。:2013/07/26(金) 20:28:53.82 ID:ijdGhvr80
11.3.7 日付と時刻

use 5.016;
use warnings;
use DateTime;
use Time::Piece;

# DateTime
my $dt = DateTime->now(time_zone => 'local');
say $dt->ymd('/'), " ", $dt->hms('.');

# Time::Piece
my $tp = localtime;
say $tp->ymd('/'), " ", $tp->hms('.');

結果(例)
2013/07/26 20.14.41
2013/07/26 20.14.41

Time::Piece等の注意

perlfaq4 - データ操作 昨日の日付を得るには?
http://perldoc.jp/docs/perl/5.14.1/perlfaq4.pod#How32do32I32find32yesterdays32date63
> Perl 5.10 から、Time::Piece と Time::Seconds は標準配布の 一部になったので、
> 以下のようにすることを考えるかもしれません:

> use Time::Piece;
> use Time::Seconds;

> my $yesterday = localtime() - ONE_DAY; # WRONG
> print "Yesterday was $yesterday\n";

> Time::Piece モジュールは、オブジェクトを返す新しい localtime を エクスポートし、
> Time::Seconds は秒数を示す ONE_DAY 定数を エクスポートします。
> これは常に 24 時間前を意味し、常に昨日というわけではありません。
> これは、夏時間の終わりに 1 日が 25 時間ある時に問題があります。

79 :名無しさん名前募集中。。。:2013/07/27(土) 18:37:38.46 ID:NkayLXnQ0
12.1 ファイルテスト演算子

-x
http://perldoc.jp/func/-X
> -X FILEHANDLE
> -X EXPR
> -X DIRHANDLE
> -X
> X は以下にあげる文字で、ファイルテストを行ないます。 この単項演算子は、
> ファイル名かファイルハンドルを唯一の 引数として動作し、「あること」について
> 真であるか否かを 判定した結果を返します。 引数が省略されると、-t では STDIN を
> 調べますが、その他は $_ を調べます。 特に記述されていなければ、真として 1 を
> 返し、偽として '' を返し、ファイルが存在しなければ、未定義値を返します。

> マイナス記号の後に 英字が 1 字続くときにのみ、ファイルテストと解釈されます。

> これらの演算子は上述の「関数のように見えるルール」から免除されます。 つまり、
> 演算子の後の開きかっこは、引き続くコードのどこまでが引数を 構成するかに影響を
> 与えません。 演算子を引き続くコードから分離するには、演算子の前に開きかっこを
> 置いてください (これはもちろん、単項演算子より高い優先順位を持つ 演算子にのみ
> 適用されます):
> -s($file) + 1024 # probably wrong; same as -s($file + 1024)
> (-s $file) + 1024 # correct

> どのファイルテスト (あるいは、stat や lstat) 演算子にも、 下線だけから成る
> 特別なファイルハンドルを与えると、 前回のファイルテスト (や stat) の
> stat 構造体が使われ、 システムコールを省きます。

> Perl 5.9.1 から、純粋にシンタックスシュガーとして、ファイルテスト演算子を
> スタックさせることができるので、-f -w -x $file は -x $file && -w _ && -f _ と
> 等価です。

use 5.016;
use warnings;

$_ = $0;

say -f; # -f $_ file tests
say -fx; # "-fx" string
say -q /a/; # '-a' string

結果(例)
1
-fx
-a

80 :名無しさん名前募集中。。。:2013/07/27(土) 18:38:14.35 ID:NkayLXnQ0
12.2 stat関数とlstat関数

stat
http://perldoc.jp/func/stat
> FILEHANDLE か DIRHANDLE を通じてオープンされているファイルか、 EXPR で
> 指定されるファイルの情報を与える、13 要素のリストを返します。

> File::stat モジュールは、便利な名前によるアクセス機構を提供します。

File::stat - by-name interface to Perl's built-in stat() functions
http://search.cpan.org/~rjbs/perl-5.18.0/lib/File/stat.pm

use 5.016;
use warnings;
use File::stat;

my $sb = stat $0;

printf "File is %s, size is %s, perm %04o, mtime %s\n",
$0, $sb->size, $sb->mode & 07777,
scalar localtime $sb->mtime;

my (
$dev, $ino, $mode, $nlink, $uid, $gid, $rdev,
$size, $atime, $mtime, $ctime, $blksize, $blocks
) = CORE::stat $0;

printf "File is %s, size is %s, perm %04o, mtime %s\n",
$0, $size, $mode & 07777, scalar localtime $mtime;

結果(例)
File is ..., size is 445, perm 0666, mtime Sat Jul 27 12:14:06 2013
File is ..., size is 445, perm 0666, mtime Sat Jul 27 12:14:06 2013

81 :名無しさん名前募集中。。。:2013/07/27(土) 18:38:49.26 ID:NkayLXnQ0
12.3 localtime関数

localtime
http://perldoc.jp/func/localtime
> time 関数が返す時刻を、ローカルなタイムゾーンで測った時刻として、
> 9 要素の配列に変換します。

> Time::gmtime モジュールと Time::localtime モジュールは、それぞれ
> gmtime() 関数と localtime() 関数に、名前でアクセスする機構を提供する
> 便利なモジュールです。

Time::localtime - by-name interface to Perl's built-in localtime() function
http://search.cpan.org/~rjbs/perl-5.18.0/lib/Time/localtime.pm

perl5004delta - what's new for perl5.004
Object-oriented overrides for builtin operators
http://search.cpan.org/~rjbs/perl-5.18.0/pod/perl5004delta.pod#Object-oriented_overrides_for_builtin_operators
> File::stat
> Net::hostent
> Net::netent
> Net::protoent
> Net::servent
> Time::gmtime
> Time::localtime
> User::grent
> User::pwent

82 :名無しさん名前募集中。。。:2013/07/27(土) 18:39:41.99 ID:NkayLXnQ0
12.4 ビット演算子

ビット演算子(bitwise operator)の論理積(&)は、マスク演算に使います。
必要なビットの部分だけに1をセットし、その他を0にすることで、必要なビットだけを
取り出せます。

http://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E3%83%9E%E3%82%B9%E3%82%AF


use 5.016;
use warnings;

my $data = 0b10011101;
my $mask = 0b00001111;
printf("%08b\n", $data & $mask);

結果
00001101


use 5.016;
use warnings;
use File::stat;
use POSIX;

foreach($0, './'){
my $st = stat $_;

say;
say 'user: ',
(($st->mode & S_IRUSR) ? 'read ' : ''),
(($st->mode & S_IWUSR) ? 'write ' : ''),
(($st->mode & S_IXUSR) ? 'execute ' : '');

say 'group: ',
(($st->mode & S_IRGRP) ? 'read ' : ''),
(($st->mode & S_IWGRP) ? 'write ' : ''),
(($st->mode & S_IXGRP) ? 'execute ' : '');

say 'other: ',
(($st->mode & S_IROTH) ? 'read ' : ''),
(($st->mode & S_IWOTH) ? 'write ' : ''),
(($st->mode & S_IXOTH) ? 'execute ' : '');
say '';
}

結果(例:windows環境)
...
user: read write
group: read write
other: read write

./
user: read write execute
group: read write execute
other: read write execute

83 :名無しさん名前募集中。。。:2013/07/29(月) 23:45:59.89 ID:Kmu8j3Wj0
13.1 ディレクトリツリーの中を移動する

chdir
http://perldoc.jp/func/chdir
> chdir EXPR
> chdir FILEHANDLE
> chdir DIRHANDLE
> chdir
> (可能であれば、) カレントディレクトリを EXPR に移します。
> EXPR を指定しないと、$ENV{HOME} が設定されていれば、そのディレクトリに 移ります;
> そうでなく、$ENV{LOGDIR}が設定されていれば、そのディレクトリに 移ります。
> (VMS では $ENV{SYS$LOGIN} もチェックされ、もしセットされていれば 使われます。)
> どちらも設定されていなければ、chdir は何もしません。 成功時には真を返し、
> そうでなければ偽を返します。

84 :名無しさん名前募集中。。。:2013/07/29(月) 23:46:19.63 ID:Kmu8j3Wj0
13.1.1 グロブ

glob
http://perldoc.jp/func/glob
> リストコンテキストでは、 EXPR の値を、標準 Unix シェル /bin/csh が行なうように
> ファイル名の展開を行なった結果のリスト(空かもしれません)を返します。
> スカラコンテキストでは、glob はこのようなファイル名展開を繰り返し、
> リストがなくなったら undef を返します。

> 空でない中かっこが glob で使われている唯一のワイルドカード文字列の 場合、
> ファイル名とはマッチングせず、可能性のある文字列が返されます。

> v5.6.0 から、この演算子は標準の File::Glob 拡張を使って 実装されています。
> 空白をパターンのセパレータとして扱わない bsd_glob を含めた 詳細は
> File::Glob を参照してください。

File::Glob
http://perldoc.perl.org/File/Glob.html


use 5.016;
use warnings;

say join(",", glob '{a,b,c}{1,2,3}');

結果
a1,a2,a3,b1,b2,b3,c1,c2,c3


13.2 グロブのもう1つの書き方

perlop - Perl の演算子と優先順位 I/O 演算子
http://perldoc.jp/docs/perl/5.16.1/perlop.pod#I47O32Operators
> 山括弧の中の文字列がファイルハンドルでもファイルハンドル名、型グロブ、
> 型グロブリファレンスのいずれかが入った単純スカラ変数でもなければ、
> グロブを行なうファイル名のパターンと解釈され、コンテキストによって
> ファイル名のリストか、そのリストの次のファイル名が返されます。
> この区別は単に構文的に行われます。 <$x> は常に間接ハンドルから readline()
> しますが、 <$hash{key}> は常に glob() します。 $x は単純スカラー変数ですが、
> $hash{key} は違う(ハッシュ要素)からです。 <$x > (余分な空白に注意) ですら
> readline($x) ではなく glob("$x ") として扱われます。

85 :名無しさん名前募集中。。。:2013/07/29(月) 23:46:45.24 ID:Kmu8j3Wj0
13.3 ディレクトリハンドル

opendir
http://perldoc.jp/func/opendir
> opendir DIRHANDLE,EXPR
> readdir、telldir、seekdir、rewinddir、closedir で 処理するために、
> EXPR で指定された名前のディレクトリをオープンします。 成功時には真を返します

readdir
http://perldoc.jp/func/readdir
> readdir DIRHANDLE
> opendir でオープンしたディレクトリで、 次のディレクトリエントリを返します。
> リストコンテキストで用いると、 そのディレクトリの残りのエントリを、
> すべて返します。 エントリが残っていない場合には、スカラコンテキストでは
> 未定義値を、 リストコンテキストでは空リストを返します。

> Perl 5.11.2 から裸の readdir を while で使うことができ、
> この場合繰り返し毎に $_ にセットされます。

closedir
http://perldoc.jp/func/closedir
> closedir DIRHANDLE
> opendir でオープンしたディレクトリをクローズし、
> システムコールの返り値を返します。

DirHandle - supply object methods for directory handles
http://perldoc.perl.org/DirHandle.html

use 5.016;
use warnings;
use DirHandle;

my $dir = DirHandle->new('./') or die $!;
while(my $name = $dir->read){
say $name;
}

結果
(略)

86 :名無しさん名前募集中。。。:2013/07/29(月) 23:47:03.47 ID:Kmu8j3Wj0
13.4 再帰的なディレクトリ処理

File::Find - Traverse a directory tree.
http://perldoc.perl.org/File/Find.html

perlopentut - Perl でいろんなものを開くためのチュートリアル ファイルでないファイルを開く
http://perldoc.jp/docs/perl/5.16.1/perlopentut.pod#Opening32Non-File32Files
> ディレクトリを再帰的に処理したい場合は、File::Find モジュールを使った方が
> いいでしょう。 例えば、これは全てのファイルを再帰的に表示して、
> もしファイルが ディレクトリの場合は末尾にスラッシュを追加します。

> @ARGV = qw(.) unless @ARGV;
> use File::Find;
> find sub { print $File::Find::name, -d && '/', "\n" }, @ARGV;

13.6 ファイルを削除する

unlink
http://perldoc.jp/func/unlink
> unlink LIST
> unlink
> LIST に含まれるファイルを削除します。 成功時は削除に成功したファイルの数を
> 返します。 失敗時は偽を返して $! (error) をセットします:
> LIST が省略されると、unlink は $_ を使います。

13.7 ファイルの名前を変更する

rename
http://perldoc.jp/func/rename
> rename OLDNAME,NEWNAME
> ファイルの名前を変更します; NEWNAME というファイルが既に存在した場合、
> 上書きされるかもしれません。 成功時には真を、さもなければ偽を返します。

File::Copy - Copy files or filehandles
http://perldoc.perl.org/File/Copy.html

13.8 リンクとファイル

link
http://perldoc.jp/func/link
> link OLDFILE,NEWFILE
> OLDFILE にリンクされた、新しいファイル NEWFILE を作ります。
> 成功時には真を、さもなければ偽を返します。

symlink
http://perldoc.jp/func/symlink
> symlink OLDFILE,NEWFILE
> NEWFILE として、OLDFILE へのシンボリックリンクを生成します。
> 成功時には 1 を返し、失敗時には 0 を返します。 シンボリックリンクを
> サポートしていないシステムでは、 例外が発生します。

readlink
http://perldoc.jp/func/readlink
> readlink EXPR
> readlink
> シンボリックリンクが実装されていれば、 シンボリックリンクの値を返します。
> 実装されていないときには、例外が発生します。 何らかのシステムエラーが
> 検出されると、未定義値を返し、 $! (errno) を設定します。
> EXPR が省略されると、$_ を使います。

87 :名無しさん名前募集中。。。:2013/07/29(月) 23:47:32.38 ID:Kmu8j3Wj0
13.9 ディレクトリの作成と削除

mkdir
http://perldoc.jp/func/mkdir
> mkdir FILENAME,MASK
> mkdir FILENAME
> mkdir
> FILENAME で指定したディレクトリを、MASK で指定した許可モード(を umask
> で修正したもの) で作成します。 成功時には真を返します; さもなければ
> 偽を返して $! (errno) を設定します。 MASK を省略すると、0777 とみなし、
> FILENAME を省略すると、$_ を使います。

rmdir
http://perldoc.jp/func/rmdir
> rmdir FILENAME
> rmdir
> FILENAME で指定したディレクトリが空であれば、 そのディレクトリを削除します。
> 成功時には真を返します; さもなければ偽を返して $! (errno) を設定します。
> FILENAME を省略した場合には、$_ を使用します。

File::Path - Create or remove directory trees
http://perldoc.perl.org/File/Path.html

13.10 パーミッションを変更する

chmod
http://perldoc.jp/func/chmod
> chmod LIST
> LIST に含まれるファイルの、パーミッションを変更します。 LIST の最初の要素は、
> 数値表現のモードでなければなりません; 恐らく 8 進表記の数であるべきでしょう:
> しかし、8 進表記の 文字列ではいけません: 0644 は OK ですが、 '0644' は だめ、
> ということです。 変更に成功したファイルの数を返します。 文字列を使いたい場合は、
> oct を参照してください。

なぜ私の 8 進データは正しく解釈されないのでしょうか?
http://perldoc.jp/docs/perl/5.14.1/perlfaq4.pod#Why32isnt32my32octal32data32interpreted32correctly63
> コマンドラインの chmod は、最初の引数として 8 進数を 求めているので、
> 最初の引数が 8 進数だと分かっています:

> %prompt> chmod 644 file

> もし同じリテラルの数字 (644) を Perl で使いたいなら、 先頭に 0 を付けるか oct を
> 使うことで Perl にこれを 8 進数で 扱うように教える必要があります:

> chmod( 0644, $file); # right, has leading zero
> chmod( oct(644), $file ); # also correct

> この問題は、Perl が文字列として考えているところ、例えば @ARGV の
> コマンドライン引数から数字を持ってくる場合に起こります:

88 :名無しさん名前募集中。。。:2013/07/29(月) 23:47:52.97 ID:Kmu8j3Wj0
13.11 ファイルのオーナーを変更する

chown
http://perldoc.jp/func/chown
> chown LIST
> LIST に含まれるファイルの所有者 (とグループ) を変更します。 LIST の最初の
> 二つの要素には、数値表現 の uid と gid を この順序で与えなければなりません。
> どちらかの値を -1 にすると、ほとんどのシステムではその値は 変更しないと
> 解釈します。 変更に成功したファイルの数を返します。

13.12 タイムスタンプを変更する

utime
http://perldoc.jp/func/utime
> utime LIST
> ファイルのアクセス時刻と修正(modification) 時刻を変更します。 LIST の
> 最初の二つの要素に、数値で表わしたアクセス時刻と修正時刻を 順に指定します。
> 変更に成功したファイルの数を返します。 各ファイルの inode 変更(change)時刻には、
> その時点の時刻が設定されます。

89 :名無しさん名前募集中。。。:2013/07/30(火) 22:24:20.13 ID:/fZuR1jC0
14.1 indexを使って部分文字列を探す

index
http://perldoc.jp/func/index
> index STR,SUBSTR,POSITION
> index STR,SUBSTR
> index 関数は ある文字列をもうひとつの文字列から検索しますが、 完全正規表現
> パターンマッチのワイルドカード的な振る舞いはしません。 STR の中の POSITION の
> 位置以降で、最初に SUBSTR が見つかった位置を返します。 POSITION が省略された
> 場合には、STR の最初から探し始めます。 POSITION が文字列の先頭より前、
> あるいは末尾より後ろを指定した場合は、 それぞれ先頭と末尾を指定されたものとして
> 扱われます。 POSITION と返り値のベースは、0 です。 SURSTR が
> 見つからなかった場合には、index は -1 が返されます。

rindex
http://perldoc.jp/func/rindex
> rindex STR,SUBSTR,POSITION
> rindex STR,SUBSTR
> STR 中で 最後に 見つかった SUBSTR の位置を返すことを除いて、 index() と
> 同じように動作します。 POSITION を指定すると、その位置から始まるか、
> その位置より前の、 最後の位置を返します。

90 :名無しさん名前募集中。。。:2013/07/30(火) 22:24:57.89 ID:/fZuR1jC0
14.2 substrを使って部分文字列をいじる

substrをLvalue(代入先)に使うのは、お勧めしません。

substr
http://perldoc.jp/func/substr
> substr EXPR,OFFSET,LENGTH,REPLACEMENT
> substr EXPR,OFFSET,LENGTH
> substr EXPR,OFFSET
> EXPR から、部分文字列を取り出して返します。 最初の文字がオフセット 0 となります。
> OFFSET に負の値を設定すると、EXPR の終わりからのオフセットとなります。
> LENGTH を省略すると、EXPR の最後まですべてが返されます。 LENGTH が負の値だと、
> 文字列の最後から指定された数だけ文字を取り除きます。

> 負数のオフセットの場合、ターゲット文字列が修正されたときに文字列の末尾からの
> 位置を覚えます:
> バージョン 5.10 より前の Perl では、複数回左辺値を使った場合の結果は
> 未定義でした。 5.16 より前では、負のオフセットの結果は未定義です。

perl5100delta - perl 5.10.0 の新機能 substr() の lvalue は固定長でなくなりました
http://perldoc.jp/docs/perl/5.12.1/perl5100delta.pod#substr40lvalue32
> 3引数形式の substr() から返される lvalue 値は オリジナルの文字列での
> "固定長のウィンドウ"を持っていました. いくつかのケースにおいてこれは離れた
> 場所でのびっくりする動作や 他の未定義な振る舞いとなっていました.
> このウィンドウの長さはそれに代入された文字列の長さに 調整されるようになりました.
> (編注:$x="1234";$y=(substr($x,1,2)="ABCD"); とした時, これまでは $x="1ABCD4",
> $y="AB" となっていたけれど, 5.10 以降は $x="1ABCD4", $y="ABCD" になる.)

91 :名無しさん名前募集中。。。:2013/07/30(火) 22:25:14.55 ID:/fZuR1jC0
perl5160delta - perl v5.16.0 での変更点 substr lvalue revamp
http://perldoc.jp/docs/perl/5.16.0/perl5160delta.pod#substr32lvalue32revamp
> 左辺値や潜在的な左辺値コンテキストで 2 引数または 3 引数の substr が
> 呼び出されると、代入するときに元の文字列(1 番目の引数)を修正する
> 特殊な左辺値スカラを返します。

> my $string = "string";
> my $lvalue = \substr $string, -4, 2;
> print $$lvalue, "\n"; # prints "ri"
> $string = "bailing twine";
> print $$lvalue, "\n"; # prints "wi"; used to print "il"

use 5.016;
use warnings;

my $string = 'London bridge is broken down';
my $part = \(substr $string, -4, 4);
say ${$part};

$string = 'My fair lady';
say ${$part};

結果
down
lady


use strict;
use warnings;

my $string = 'London bridge is broken down';
my $part = substr($string, 17, 6) = 'falling';
print $part, "\n";
print $string, "\n";

結果(5.16)
falling
London bridge is falling down

結果(5.8)
fallin
London bridge is falling down

92 :名無しさん名前募集中。。。:2013/07/30(火) 22:25:35.22 ID:/fZuR1jC0
14.3 sprintfを使ってデータをフォーマットする

適当な丸め

perlfaq4 - データ操作
なぜ 19.95 のような数字ではなく、19.9499999999999 のような長い数字が出てきたんでしょうか?
http://perldoc.jp/docs/perl/5.14.1/perlfaq4.pod#Why32am32I32getting32long32decimals32eg4419.949999999999941instead32of32the32numbers32I32should32be32getting32eg4419.9541
> 10 進数の桁数を制限するには、printf や sprintf の関数が使えます。
> 更なる詳細については "Floating Point Arithmetic" in perlop を参照してください。
> printf "%.2f", 10/3;
> my $number = sprintf "%.2f", 10/3;

perlop - Perl の演算子と優先順位 浮動小数点数演算
http://perldoc.jp/docs/perl/5.16.1/perlop.pod#Floating32Point32Arithmetic

use 5.016;
use warnings;

say 1.2 - 1.1;
printf "%.2f", 1.2 - 1.1;

結果
0.0999999999999999
0.10

93 :名無しさん名前募集中。。。:2013/07/30(火) 22:25:52.14 ID:/fZuR1jC0
数値にカンマを入れる

出力する数字にカンマを付加するには?
http://perldoc.jp/docs/perl/5.14.1/perlfaq5.pod#How32can32I32output32my32numbers32with32commas32added63

Number::Format - Perl extension for formatting numbers
http://search.cpan.org/~wrw/Number-Format-1.73/Format.pm

use 5.016;
use warnings;
use Number::Format qw(:subs);

say format_number(12345678.90);

結果
12,345,678.9


14.3.2 10進以外の数を解釈する

hex
http://perldoc.jp/func/hex
> hex EXPR
> hex
> EXPR を 16 進数の文字列と解釈して、対応する値を返します。
> (0, 0x, 0b で始まる文字列の変換には、oct を 参照してください。)
> EXPR が省略されると、$_ を使います。

oct
http://perldoc.jp/func/oct
> oct EXPR
> oct
> EXPR を 8 進数文字列と解釈して、対応する値を返します。
> (EXPR が 0x で始まるときには、16 進数文字列と解釈します。 EXPR が
> 0bで始まるときは、2 進数文字列と解釈します。 どの場合でも、先頭の空白は
> 無視されます。)

94 :名無しさん名前募集中。。。:2013/07/30(火) 22:26:17.94 ID:/fZuR1jC0
14.4 高度なソート

sort
http://perldoc.jp/func/sort
> sort SUBNAME LIST
> sort BLOCK LIST
> sort LIST
> リストコンテキストでは、LIST をソートし、ソートされたリスト値を返します。
> スカラコンテキストでは、sort() の振る舞いは未定義です。

> SUBNAME や BLOCK を省略すると、標準の文字列比較の順番でソートが 行なわれます。
> SUBNAME を指定すると、それは、リストの要素をどのような順番に並べるかに
> 応じて、負、ゼロ、正の整数を返すサブルーチンの名前であると解釈されます。

> use locale が有効(そして use locale 'not_characters' が有効でない)の
> 場合、sort LIST は LIST を現在の比較ロケールに従ってソートします。

> <=> はどちらかのオペランドが NaN (not-a-number) のときに undef を返すので、
> $a <=> $b といった比較関数でソートする場合はリストに NaN が 含まれないように
> 注意してください。 以下の例は 入力リストから NaN を取り除くために
> NaN != NaN という性質を 利用しています。

> @result = sort { $a <=> $b } grep { $_ == $_ } @input;

perlop - Perl の演算子と優先順位 等価演算子
http://perldoc.jp/docs/perl/5.16.1/perlop.pod#Equality32Operators
> 二項演算子の "<=>" は左引数が数値的に右引数より小さいか、等しいか、
> 大きいかに従って、-1, 0, 1 を返します。
> 数値として NaN (非数) に対応しているプラットフォームでは、
> NaN に対して "<=>" を使うと undef を返します。

> 二項演算子の "cmp" は左引数が文字列的に右引数より小さいか、
> 等しいか、大きいかに従って、-1, 0, 1 を返します。

95 :名無しさん名前募集中。。。:2013/07/30(火) 22:26:37.35 ID:/fZuR1jC0
Unicodeにおける比較

Unicode::Normalize - Unicode Normalization Forms
http://search.cpan.org/~sadahiro/Unicode-Normalize-1.16/Normalize.pm

Unicode正規化
http://ja.wikipedia.org/wiki/Unicode%E6%AD%A3%E8%A6%8F%E5%8C%96
Unicodeの互換文字
http://ja.wikipedia.org/wiki/Unicode%E3%81%AE%E4%BA%92%E6%8F%9B%E6%96%87%E5%AD%97

use 5.016;
use warnings;
use Unicode::Normalize;
use charnames qw(:full);

foreach(
['roman six' => "\N{ROMAN NUMERAL SIX}"],
['roman five one' => "\N{ROMAN NUMERAL FIVE}\N{ROMAN NUMERAL ONE}"],
['five one' => 'VI'],
['NFKD roman six' => NFKD("\N{ROMAN NUMERAL SIX}")],
['NFKD romna five one' => NFKD("\N{ROMAN NUMERAL FIVE}\N{ROMAN NUMERAL ONE}")],
){
printf("%s: %0*v4X\n", $_->[0], ',', $_->[1]);
}

結果
roman six: 2165
roman five one: 2164,2160
five one: 0056,0049
NFKD roman six: 0056,0049
NFKD romna five one: 0056,0049


use 5.016;
use warnings;
use Unicode::Normalize;
use charnames qw(:full);

my @array = (
"\N{ROMAN NUMERAL FOUR}",
"\N{ROMAN NUMERAL ONE}\N{ROMAN NUMERAL ONE}",
"III",
);

foreach(sort{ NFKD($a) cmp NFKD($b) } @array){
printf("%0*v4X\n", ',', $_);
}

結果
2160,2160
0049,0049,0049
2163

96 :名無しさん名前募集中。。。:2013/07/30(火) 22:54:20.69 ID:/fZuR1jC0
14.4.1 ハッシュ値によってソートする

perlfaq4 - データ操作 ハッシュを(キーではなく値で)ソートするには?
http://perldoc.jp/docs/perl/5.14.1/perlfaq4.pod#How32do32I32sort32a32hash32optionally32by32value32instead32of32key41
> ハッシュの値でソートしたいなら、それを探すためにハッシュキーを 使います。
> やはりキーのリストを使いますが、今度はその値でソートします。
> my @keys = sort { $hash{$a} <=> $hash{$b} } keys %hash;

14.4.2 複数のキーでソートする

perlfaq4 - データ操作 (なにか)で配列をソートするには?
http://perldoc.jp/docs/perl/5.14.1/perlfaq4.pod#How32do32I32sort32an32array32by32anything41
> 幾つかのフィールドを使ってソートする必要があるのなら、
> 以下のやり方が便利でしょう。
> @sorted = sort {
> field1($a) <=> field1($b) ||
> field2($a) cmp field2($b) ||
> field3($a) cmp field3($b)
> } @data;

> ソートするものの一部を取り出す必要があるような複雑な関数を使うのなら、
> ソート関数の内側でそれを使ってはいけません。 最初にその関数で使う部分を
> 取り出します。 なぜなら、sort BLOCK は同じ要素に対して何度も何度も
> 呼び出される 可能性があるからです。

> シュワルツ変換と呼ばれるトリックを使って以下のように 書くこともできます:

> @sorted = map { $_->[0] }
> sort { $a->[1] cmp $b->[1] }
> map { [ $_, uc( (/\d+\s*(\S+)/)[0]) ] } @data;

97 :名無しさん名前募集中。。。:2013/07/30(火) 22:54:44.61 ID:/fZuR1jC0
use 5.016;
use warnings;
use Unicode::Normalize;
use charnames qw(:full);
use Roman;

my @array = (
"\N{ROMAN NUMERAL FOUR}",
"\N{ROMAN NUMERAL ONE}\N{ROMAN NUMERAL ONE}",
"C",
"III",
);

my @sorted =
map{ $_->[0] }
sort{ $a->[1] <=> $b->[1] }
map{ [$_, arabic NFKD($_)] }
@array;

foreach(@sorted){
printf("%0*v4X\n", ',', $_);
}

結果
2160,2160
0049,0049,0049
2163
0043

98 :名無しさん名前募集中。。。:2013/08/01(木) 19:08:01.19 ID:VNqrjkmS0
16.1 system関数

system
http://perldoc.jp/func/system
> system LIST
> system PROGRAM LIST
> exec LIST とほとんど同じですが、まず fork を行ない、 親プロセスでは
> チャイルドプロセスが終了するのを wait します。 exec の項で述べたように、
> 引数の処理は、引数の数によって異なることに 注意してください。 LIST に
> 複数の引数がある場合、または LIST が複数の要素からなる配列の場合、 リストの
> 最初の要素で与えられるプログラムを、リストの残りの要素を引数として 起動します。
> スカラの引数が一つだけの場合、引数はシェルのメタ文字をチェックされ、もし
> あればパースのために引数全体がシステムコマンドシェル (これは
> Unix プラットフォームでは /bin/sh -c ですが、他のプラットフォームでは
> 異なります)に渡されます。 シェルのメタ文字がなかった場合、引数は単語に
> 分解されて直接 execvp に 渡されます; この方がより効率的です。
> 返り値は、wait が返すプログラムの exit 状態です。 実際の exit 値を得るには
> 右に 8 ビットシフトしてください(後述)。 exec も参照してください。

16.1.1 シェルの起動を避ける

スカラ値でシステムシェルにコマンドを渡す場合、コマンドインジェクション脆弱性を
常に考慮してください。

16.2 環境変数

Env - perl module that imports environment variables as scalars or arrays
http://perldoc.perl.org/Env.html

use 5.016;
use warnings;
use Env qw(TZ);

say scalar localtime;

if (@ARGV < 1){
local $TZ = 'UCT10'; # Hawaii
system('perl', $0, 1);
}

結果(例)
Thu Aug 1 19:07:34 2013
Thu Aug 1 00:07:34 2013


16.3 exec関数

exec
http://perldoc.jp/func/exec
> exec LIST
> exec PROGRAM LIST
> exec 関数は、システムのコマンドを実行し、戻ってはきません;
> コマンドが存在せず、しかも システムのコマンドシェル経由でなく
> 直接コマンドを実行しようとした場合にのみこの関数は失敗して偽を返します。

99 :名無しさん名前募集中。。。:2013/08/01(木) 19:08:40.71 ID:VNqrjkmS0
16.4 逆クォートを使って出力を取り込む

perlop - Perl の演算子と優先順位 クォート風演算子
http://perldoc.jp/docs/perl/5.16.1/perlop.pod#Quote-Like32Operators
> qx/STRING/
> `STRING`
> 展開され、/bin/sh またはそれと等価なものでシステムのコマンドとして
> 実行される(であろう)文字列です。 シェルのワイルドカード、パイプ、
> リダイレクトが有効です。 そのコマンドの、標準出力を集めたものが返されます;
> 標準エラーは影響を 与えません。 スカラコンテキストでは、(複数行を含むかも
> しれない) 1 つの文字列が戻ってきます; コマンドが失敗したときは未定義値を
> 返します。 リストコンテキストでは、($/ もしくは $INPUT_RECORD_SEPARATOR を
> どのように設定していても) 行のリストを返します; コマンドが失敗したときは
> 空リストを返します。

16.5 IPC::System::Simpleによる外部プロセスの起動

IPC::System::Simple - Run commands simply, with detailed diagnostics
http://search.cpan.org/~pjf/IPC-System-Simple-1.21/lib/IPC/System/Simple.pm

use 5.016;
use warnings;
use IPC::System::Simple qw(capturex);

my $line = (
$^O =~ /Win32/i ?
q{"print qq{Hello, world!\n}"} :
q{print qq{Hello, world!\n}}
);

print capturex('perl', '-e', $line);

結果
Hello, world!


※Windows環境下ではダブルクォートで挟む必要があるようです。

100 :名無しさん名前募集中。。。:2013/08/01(木) 19:08:55.83 ID:VNqrjkmS0
16.6 プロセスをファイルハンドルとして使う

perlipc - Perl のプロセス間通信 (シグナル, fifo, パイプ, 安全な副プロセス, ソケット, セマフォ)
IPC のために open() を使う
http://perldoc.jp/docs/perl/5.16.1/perlipc.pod#Using32open40for32IPC
> Perlの open() 文は、その第二引数でパイプシンボルを前置するか末尾に
> 付加することによって、一方向のプロセス間通信のために使うことができます。
> 以下の例は、書き込みを行いたい子プロセスを起動させるやり方です:

> open(SPOOLER, "| cat -v | lpr -h 2>/dev/null")
> || die "can't fork: $!";
> local $SIG{PIPE} = sub { die "spooler pipe broke" };
> print SPOOLER "stuff\n";
> close SPOOLER || die "bad spool: $! $?";

>そして以下の例はそこから読み込みを行いたい子プロセスを起動する方法です:

> open(STATUS, "netstat -an 2>&1 |")
> || die "can't fork: $!";
> while (<STATUS>) {
> next if /^(tcp|udp)/;
> print;
> }
> close STATUS || die "bad netstat: $! $?";

> open() と close() の戻り値をチェックするときは注意してください。
> パイプに対して 書き込み をしたのなら、SIGPIPE をトラップすべきです。
> そうしなければ、存在しないコマンドに対するパイプを起動したときに
> 起こることについて考え込むことになるでしょう: open() はほとんどの
> 場合成功すると見込まれるでしょうが(これは fork() の成功だけを
> 反映します)、あなたの出力はその後で壮観に(spectacularly)失敗するでしょう。
> コマンドは、実際には exec() が失敗している別のプロセスで
> 実行されているので、Perl はコマンドがうまく動いているかどうかを
> 知ることはできません。

128KB
続きを読む

名前: E-mail(省略可)
READ.CGI - 0ch+ BBS 0.7.4 20131106
ぜろちゃんねるプラス