トップページ⇒tech
1001コメント327KB

Perlについての質問箱 49箱目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2011/10/30(日) 14:44:20.41
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perl の区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: http://hibari.2ch.net/php/ )

このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。

http://www.perl.org/get.html
● 2011/10/30 現在の最新版: 5.14.2

▼ 前スレ
Perlについての質問箱 48箱目
http://hibari.2ch.net/test/read.cgi/tech/1313840197/
リンク集は >>2-3辺り
Perl 日本語処理の基礎の基礎 >>4辺り
0002デフォルトの名無しさん2011/10/30(日) 14:45:15.61






               Perlは死んだ





0003デフォルトの名無しさん2011/10/30(日) 14:45:36.91





       さようなら! 過去の言語!





0004デフォルトの名無しさん2011/10/30(日) 14:45:52.85
[プログラミング自体の経験が無い奴はまずココを読め]
Perl プログラミング講座: ttp://www.site-cooler.com/kwl/perl/

[本]
リャマ: ttp://www.oreilly.co.jp/books/9784873114279/
駱駝: ttp://www.oreilly.co.jp/books/4873110963/
Effective Perl: ttp://ascii.asciimw.jp/books/books/detail/4-7561-3057-7.shtml
クックブック: ttp://www.oreilly.co.jp/books/4873112028/
Perl ベストプラクティス: ttp://www.oreilly.co.jp/books/4873113008/
Perl Hacks: ttp://www.oreilly.co.jp/books/9784873113142/

[オンラインマニュアル]
最新のドキュメント: ttp://search.cpan.org/dist/perl/
perldoc.jp: ttp://perldoc.jp/
perldoc.perl.org: ttp://perldoc.perl.org/
0005デフォルトの名無しさん2011/10/30(日) 14:46:10.22
今は日本語処理はEncodeモジュール一択


Jcode関係は過去のやり方です。
0006デフォルトの名無しさん2011/10/30(日) 14:46:42.49
[モジュール]
CPAN.com: ttp://search.cpan.org/
河馬屋二千年堂: ttp://homepage3.nifty.com/hippo2000/

[テクニック]
Perl メモ: ttp://www.din.or.jp/~ohzaki/perl.htm
Perl のページ: ttp://homepage1.nifty.com/nomenclator/perl/
Perl の小技: ttp://homepage3.nifty.com/hippo2000/perltips/index.htm

[Perl 5.8 Unicodeメモ]
ttp://www.rwds.net/kuroita/program/Perl_unicode.html (修正)
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0007デフォルトの名無しさん2011/10/30(日) 14:47:28.43
# [Perl 日本語処理の基礎の基礎]
# このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。
# このレスの内容をそのまま、UTF8 形式のソースファイルに保存して下さい。
# 入出力ともシフト JIS 形式のファイルまたは DOS 窓を想定しています。
# まず、以下の行を先頭に入れて下さい。
use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)"; # ※1
use Encode;
# 次に、あなたが実行したい処理の内容を入れて下さい。
$file = 'C:/なんたら/かんたら.txt';
open my $fh, '<', encode("cp932", $file) or die $! ; # ※2
print <$fh>;
# 以上の内容は、日本語処理が解らない人でも、とりあえず日本語処理ができてしまう
# おまじないです。条件が異なる場合の対処方法は、ご自分で勉強して下さい。
# 【注】※1. の行を入れると、DOS 窓への日本語出力は簡便になりますが、
# ソースファイル名に非 ANSI 文字が含まれる場合に die 文の出力が失敗します。
# ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、
# この例のように cp932 でエンコードする必要があります。
0008デフォルトの名無しさん2011/10/30(日) 14:48:11.67
なんかへんなのに割り込まれちった。まあいいや。
0009デフォルトの名無しさん2011/10/30(日) 14:49:17.18
Encodeモジュール (現在のPerl文字コードの標準)
http://search.cpan.org/dist/Encode/

UNICODEでわからなくなったらここを読め
http://perldoc.jp/docs/perl/5.8.1/utf8.pod
http://perldoc.jp/docs/perl/5.10.0/perlunifaq.pod
0010デフォルトの名無しさん2011/10/30(日) 14:50:21.93
1レスで理解できるutf8フラグ

utf8フラグとい名前がまずかったね。
文字列フラグなどという名前だったらよかった。

文字列フラグはPerl固有のものだから
Perlコード外部から渡されるのは文字列ではない。
文字列でなかったらなにか?それはバイナリ。

バイナリを文字として扱いたければ、文字に変換しないといけない。
それがdecode。

ではソースコードに書いてあるのは、文字かバイナリか。
それはuse utf8を使えば文字で、そうでない場合はバイナリ。

話はこれだけ。
0011デフォルトの名無しさん2011/10/30(日) 14:50:36.62
use Encode;
while(<>){
  chomp;
  my @row = split(/,/, $_);
  for my $row (@row){
    Encode::from_to($row,'utf8','sjis');
    print $row;
  }
}
0012デフォルトの名無しさん2011/10/30(日) 14:53:48.76
古いPerlにまどわされないために

モダンPerlの世界へようこそ
http://gihyo.jp/dev/serial/01/modern-perl/0001
0013デフォルトの名無しさん2011/10/30(日) 14:54:42.28
バイナリと文字列は同じものなので区別なく扱えるのがUNIXやPerlの利点。
Windowsだとそうはいかない。
0014デフォルトの名無しさん2011/10/30(日) 14:55:54.27
> バイナリと文字列は同じものなので

文字列には、文字数というものがあるので
文字とバイナリは違います。
0015デフォルトの名無しさん2011/10/30(日) 14:58:04.92
OSに関係なく、少なくとも文字列はバイナリデータに含まれます。
0016デフォルトの名無しさん2011/10/30(日) 14:59:33.85
そしてバイナリデータを文字列のように扱えるのなら覚えることが
減るので利用者として楽です。
0017デフォルトの名無しさん2011/10/30(日) 15:00:07.72
・バイナリ

ビット(バイト)が並んだもの。それ以外に情報を持っていない。


・文字列

バイナリに様々なメタ情報が追加されたもの。
文字コード情報がが固定、もしくは内包されている。
データの終端情報を持っている。
1文字という概念がある。1文字は多バイト、または可変バイトで構成されている。
バイト単位での操作は行わない。
0018デフォルトの名無しさん2011/10/30(日) 15:05:07.88
つまんないこと言ってないで、Data::Dumper 答えてやれよ
0019デフォルトの名無しさん2011/10/30(日) 15:14:41.24
テキストデータとバイナリデータの違いは何かという普遍的な議論へ
0020デフォルトの名無しさん2011/10/30(日) 15:18:01.66
文字列フラグというければ、chr($n) で $n < 255 のときとそうでない
ときでフラグがつく、つかないが変わる、ということからすると、latin-1
リテラルで Unicode 文字列をあらわすというのは今でも、それが perl
の正しい文字列の扱い方ということになるとおもう。
0021デフォルトの名無しさん2011/10/30(日) 15:19:34.86
>>20
日本語でおk
0022デフォルトの名無しさん2011/10/30(日) 15:22:16.34
>>20
だから、そういうへんな挙動がないEncodeモジュールを
使ってくださいと書いてあるんだよ。
http://perldoc.jp/docs/perl/5.8.1/utf8.pod

> utf8::encode($string)
>
> 論理キャラクタを、8ビットシーケンス表現に、PerlのUTF-Xエンコーディングに、
> (適切に)変換します。何も返しません。 Encode::encode_utf8()と同じです。
> 次のことに注意してください。レガシーのバイトエンコーディングを、
> Unicode にする変換に使うべきではありません:そのためには、Encode を使って下さい。
0023デフォルトの名無しさん2011/10/30(日) 15:47:51.88
>>17
そこに書いた「文字列」を「文字列インスタンス」「文字列オブジェクト」
と書換えるのなら構わないけど、一般的な言葉の「文字列」をその定義に
しちまうのはどうよ?

そうでないと今、見えているものが文字列じゃなくなっちゃうぞ。
0024デフォルトの名無しさん2011/10/30(日) 15:57:16.10
> そうでないと今、見えているものが文字列じゃなくなっちゃうぞ。

なんで? データの終端情報は微妙だけど、

ここに書いてある文字を読むためには、ShiftJISという文字コード
まで含めてやっと文字列として読めるだろ?

そしてその1文字が何バイトであるかなんて考えないだろ?
0025デフォルトの名無しさん2011/10/30(日) 16:23:16.44
そもそも紙に手書きしたものも文字列だし、印刷した場合でも文字列。
パピルスに書かれたものも、粘土板に刻まれたものも、木簡に書かれた
ものも文字列と言われてきたのだから、これからもそうしたほうがいい
と思う。

       (それともお前が全部燃やしたいの?)

・(ひとが扱う)文字列

バイナリに様々なメタ情報が追加されたもの。
→ コンピュータ導入前から人間は文字列は使っているわけで、"バイナリ"
 は無関係。コンピュータがデジタルではなった場合も然り。

文字コード情報が固定、もしくは内包されている。
→ 同じ理由で文字コード情報は文字列の定義に関係がない。

データの終端情報を持っている。
→ バイナリデータだって終端情報を持っていることがある。

1文字という概念がある。
→ 確かに。でももしかしたら1文字の概念があやふやだったり、なかったり
 するようなもの(言語?)もあるかもしれない。

1文字は多バイト、または可変バイトで構成されている。バイト単位での
操作は行わない。
→ これまたコンピュータ上/内の話。コンピュータの有無やその構造・方式
 と文字列の定義は無関係。
0026デフォルトの名無しさん2011/10/30(日) 16:26:32.52
>>25
意味がわからん。
今はコンピュータ上の文字の表現の仕方の話だろ。

手書きしたものとか言い出したら、
文字はバイナリではない(分子かなんかカ?w)ということになるだろ。

なに関係ありそうで関係ないものの話持ちだしてんだかw
こいつは頭が悪いと認定してよさそうだ。
0027デフォルトの名無しさん2011/10/30(日) 16:29:44.06
What is Unicode?
ttp://www.unicode.org/standard/WhatIsUnicode.html
に
Fundamentally, computers just deal with numbers. They store letters
and other characters by assigning a number for each one.

ってあるようにコンピュータは文字を扱うわけではない。
0028デフォルトの名無しさん2011/10/30(日) 16:33:21.15
バイナリだけでは、それを文字として認識することは不可能。
文字コード情報が別に必要になる。

ASCIIだって、ASCIIコードという情報がなければ、
アルファベットですら文字として認識できない。
たとえばASCIIコードでABCDと書いてあるように見えても、
これはASCIIではなくUTF32ですといわれれば別の文字になるしね。
文字を文字として認識するためには、文字コード情報が必要不可欠。

C言語とかこの文字コード情報が文字列にくっついていないから
(そもそもC言語には文字はあっても文字列はないんだが)
文字として表示するためには人間が文字コードのことを考慮する必要があった。

最近の言語では、文字とバイナリは区別され、文字には文字コード情報が内包されている。
そのため、人間がいちいち文字コードは何か? と考える必要がなくなった。
PerlのUTF8フラグもその一つ。
0029デフォルトの名無しさん2011/10/30(日) 16:35:11.85
>>27
中途半端に持ってくるなよ

基本的に、コンピュータは数字だけを扱います。彼らはそれぞれに番号を割り当てることによって、
文字や他の文字を格納する。ユニコードが発明される前に、これらの番号を割り当てるための
さまざまなエンコーディングシステムの何百ものがあった。単一の符号化に十分な文字が含まれていないことができます:
例えば、欧州連合(EU)だけではそのすべての言語をカバーするいくつかの異なるエンコーディングが必要です。
であっても英語のような単一言語の単一の符号化は、共通使用されているすべての文字、句読点、技術記号のための十分でした。

お互いに、これらの符号化システムは、また競合。つまり、二つのエンコーディングは、2つの異なる文字に対して同じ番号を使用して、
または同じ文字に異なる番号を使用することができます。任意のコンピュータ(特にサーバ)さまざまなエンコーディングを
サポートする必要があります。まだいつでもデータが異なるエンコーディングやプラットフォーム間で受け渡され、データは常に破損の危険性を実行される。
0030デフォルトの名無しさん2011/10/30(日) 16:36:46.56
>>29からも解るように、

「2つの異なる文字に対して同じ番号」を割り当てるわけ。
つまり番号からでは、どの文字かどうかはわからない。
そこで使用されるのが、エンコーディング(文字コード)

番号を文字として認識するには、文字コード情報が必要不可欠
0031デフォルトの名無しさん2011/10/30(日) 16:47:39.58
ここがPerlスレなのは承知してるけど、文字列はPerlだけのものじゃないだろ?
例えばPerlで処理した後にPythonで処理したり、お前の母ちゃんが処理したり
することもあるだろ?
0032デフォルトの名無しさん2011/10/30(日) 16:49:32.04
>>31
そういう場合は文字を一旦バイナリに変換する。
そして他の言語でバイナリとして読み取ったものを
その言語用の文字列として変換するんだよ。
0033デフォルトの名無しさん2011/10/30(日) 16:51:39.46
どうしてもバイナリと対比させたいんだなw
0034デフォルトの名無しさん2011/10/30(日) 16:53:22.73
お前の母ちゃんバイナリ扱えるのか、ちょっと感心した。
0035デフォルトの名無しさん2011/10/30(日) 17:01:38.82
もしかして、テキストエディタと
バイナリエディタの区別がつかない人?

バイナリのまま、文字列を操作するのは大変だろw
だからテキストエディタで文字列として解釈させて・・・
でも元がバイナリ(文字コードデータが含まれてない)だから、
たまに自動判定できなくて・・・

こんなことを、いちいち言わないとわからないのかな?
0036デフォルトの名無しさん2011/10/30(日) 17:03:36.76
だからコンピュータに自動判定させるなって。
0037デフォルトの名無しさん2011/10/30(日) 17:04:24.27
コンピュータは文字(文字列も)扱えないんだからさ。
0038デフォルトの名無しさん2011/10/30(日) 17:05:30.40
>>37
そんな事言ってるのはお前だけw
0039デフォルトの名無しさん2011/10/30(日) 17:08:56.05
文字(文字列)を扱っているのはお前で、お前のコンピュータが文字を
扱っているわけではない。もし今会話している相手がコンピュータ
だっていうならチューリングテスト合格だと思うぞ。
0040デフォルトの名無しさん2011/10/30(日) 17:13:07.05
コンピューター一般においての文字列(テキストデータ)として話してる人と、
プログラミング言語での文字列型に格納されてる文字列について話してる人がいるかかみ合わないのでは?
0041デフォルトの名無しさん2011/10/30(日) 17:15:24.89
perlのutf8フラグの話が発端なんだから
プログラミング言語での文字列型に格納されてる文字列
以外の話をしている人は、なんなんだろうね。
0042デフォルトの名無しさん2011/10/30(日) 17:16:08.13
(△△△クラスの)文字列オブジェクトって言ってくれれば、言っている
ことにすべて同意する。
0043デフォルトの名無しさん2011/10/30(日) 17:19:41.78
>>42
ここはperlスレ。
perlにおいて文字列オブジェクトとは
変数の値にUTF8フラグがついたもの。
0044デフォルトの名無しさん2011/10/30(日) 17:21:30.96
>>41
格納される前は、格納されるものを何て呼べばいいの?

そこを議論しているつもり。
確かに格納される前の話はPerlと無関係かもしれないけれど、説明したり
するときにどうしてもそれを表わさないといけないよね?
0045デフォルトの名無しさん2011/10/30(日) 17:27:06.39
つ ソース文字列
0046デフォルトの名無しさん2011/10/30(日) 17:29:28.39
A) 文字列にはソース文字列が格納されている
B) 文字列オブジェクトには文字列が格納されている
0047デフォルトの名無しさん2011/10/30(日) 17:32:28.52
文字列にはリテラルの語感があるので、A) が不自然に感じる。
0048デフォルトの名無しさん2011/10/30(日) 17:32:45.56
>>44
これでも読んでください。

http://perldoc.jp/docs/perl/5.10.0/perlunitut.pod
・テキスト文字列(文字の文字列)
テキスト文字列、または 文字の文字列 は文字からなります。
バイト列はここでは無意味で、エンコーディングがあります。 各文字は単に文字です。
テキスト文字列は Unicode 文字列 とも呼ばれます; なぜなら、Perl では テキスト文字列は Unicode 文字列だからです。

・バイナリ文字列(バイト文字列)
バイナリ文字列、または バイト文字列 はバイト列からなります。
ここでは、文字はなく、単にバイトだけがあります。
外側の世界(現在の Perl プロセスの外側のあらゆるもの) との通信はバイナリで 行われます。

・エンコード
エンコード は テキスト から バイナリ への変換です

・デコード
デコード は バイナリ から テキスト への変換です。
0049デフォルトの名無しさん2011/10/30(日) 17:45:18.83
質問:二次元配列の、最後の配列要素の最後の要素を参照するにはどうすればいいでしょうか。

例:
@array = (
[1,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15]
);

希望:上記2次元配列の中味が分からないという状況で、15という一番最後の数字を取得したい。
状況:@{$array[$#array]}で最後の配列要素[11,12,13,14,15]を取り出せることまで分かりました。
その後、いろいろ試したんですが、うまくいきません。[-1]は使えないみたいですし……。
ご教授お願いします。
0050デフォルトの名無しさん2011/10/30(日) 17:46:16.62
なんてことはない、
B) ≒ C) 文字列変数に文字列が格納されている
ってこと。

Perlの場合は文字と数値を区別しない変数なので文字列変数ってもの
がなかったわけで、ついでにバイナリストリングと文字列の区別も
なかった。区別がない方が便利なこともあるし、システム的に区別が
あった方が便利なこともある。

でも入れるものと入れられるものを区別できないと困るし、単語が
今までの用法と異なるのも混乱の元。
0051デフォルトの名無しさん2011/10/30(日) 17:50:42.92
print (@{$array[-1]})[-1];
0052デフォルトの名無しさん2011/10/30(日) 17:53:32.26
print $array[-1][-1];
0053デフォルトの名無しさん2011/10/30(日) 17:56:44.75
arrayって
あ〜れぇ〜って読むの?
それとも、ありぃ〜?って読むの?
0054デフォルトの名無しさん2011/10/30(日) 18:36:16.81
アレィ
0055デフォルトの名無しさん2011/10/30(日) 19:08:21.20
A') 数値にはソース数値が格納されている
B') 数値オブジェクトには数値が格納されている

数値にはリテラルの語感があるので、A') が不自然に感じる。
0056デフォルトの名無しさん2011/10/30(日) 19:16:27.45
変数に数値(数値オブジェクト)が格納されている。
変数にバイナリ値が格納されている。
変数に文字列が格納されている。

これでいいじゃん
0057デフォルトの名無しさん2011/10/30(日) 19:19:04.01
>>51
>>52
ありがとうございます。
[-1]だと何故かダメなんです。表示されません。
0058デフォルトの名無しさん2011/10/30(日) 19:21:36.92
>>57
-1 が使えない状況がおかしい。
使えないというコードそのままさらしてみ?
0059デフォルトの名無しさん2011/10/30(日) 19:26:15.90
>>56
格納される前は?
これから格納しようかと思っているものの名称は?
0060デフォルトの名無しさん2011/10/30(日) 19:29:41.19
>>59
要するに変数の右辺だろ?

変数に入れたからって、右辺の状態が
変更されるわけ無いだろ。

変数に入れるまでもなく、
数値、バイナリ値、文字列、ついでにオブジェクトだよ。
0061デフォルトの名無しさん2011/10/30(日) 19:30:26.03
×要するに変数の右辺だろ?
○要するに変数への代入式の右辺だろ?
0062デフォルトの名無しさん2011/10/30(日) 19:33:40.77
右辺といってる時点でもうスクリプトの中の話になってるしw
0063デフォルトの名無しさん2011/10/30(日) 19:39:29.07
え? スクリプト外?
なら答えは>>48に書いてあるじゃん。

> 外側の世界(現在の Perl プロセスの外側のあらゆるもの) との通信はバイナリで 行われます。

はい、バイナリです。
0064デフォルトの名無しさん2011/10/30(日) 19:40:01.46
おれ、この流れすきwww
0065デフォルトの名無しさん2011/10/30(日) 19:41:51.30
スクリプトの外には出たものの、まだコンピュータの中だな。
がんばれ!!!
0066デフォルトの名無しさん2011/10/30(日) 19:42:32.36
>>65
お前何のはなししてるの?
0067デフォルトの名無しさん2011/10/30(日) 19:47:05.38
1レスどころか66レスまでひっぱるutf8フラグ
0068デフォルトの名無しさん2011/10/30(日) 19:56:22.11
utf8フラグがあるべきところ
0069デフォルトの名無しさん2011/10/30(日) 20:00:49.05
{
no utf8;
0070デフォルトの名無しさん2011/10/30(日) 20:09:50.87
おまえらいいかげんにしろ
文字の話は↓こっちに移ったんだろうがよ

Perlについて
http://hibari.2ch.net/test/read.cgi/tech/1217851121/
0071デフォルトの名無しさん2011/10/30(日) 20:18:25.73
>>58
環境はHTML出力なので、
あまり周辺を広げるとスレ違いになりそうなんすが、

my @current_month = calendar($mon,$year); #@current_monthに対象月の日にちデータを二次元配列で格納。
print @{$current_month[-1]}[-1]; #対象月の最終日を表示。

試したもの↓
print "$current_month[-1][-1]";
print "@{$current_month[-1]}[-1]";
print "@{$current_month[$#current_month][-1]}";
print "$current_month[$#current_month][-1]";

""を外してみてもダメでした。
0072デフォルトの名無しさん2011/10/30(日) 20:22:21.56
calendar が1次元配列で返せば解決
0073デフォルトの名無しさん2011/10/30(日) 20:34:39.89
「初めてのPerl 第3版」(ちょと古い)をひと通り読んで、
モジュールの作り方とか載ってないので、次の本を探
しています。

だいたいPerlの書き方はわかったので、リファレンスを
兼ねた本がいいと思い、「プログラミングPerl 第3版」
を検討していますが、内容的には古くないでしょうか?
2002年というのがどうにも気になりまして。

あとできればマルチバイト文字にも配慮した本だと
いいのですが望み薄ですか?
shiftjisのテキストファイルを扱うときに、日本語処理に
随分手間取ったので。(Encodeモジュールを使いました)


0074デフォルトの名無しさん2011/10/30(日) 20:41:09.19
>>72
週ごとに区別する都合で2次元配列なんです。
いろいろ手間をかければ月の最終日が何日なのかは参照できると思いますが、
一発でアクセスできる方法があればなと……。
0075デフォルトの名無しさん2011/10/30(日) 20:43:04.65
@{$current_month[-1]} は最終週を返しているか確認した?
0076デフォルトの名無しさん2011/10/30(日) 20:46:39.12
use Data::Dumper ;
して、
print Dumper \@current_month ;
の結果が想定通りかまず調べろ。
実際には一次元が返ってたとか、undef が
返ってたとかあるだろ。
0077デフォルトの名無しさん2011/10/30(日) 20:47:28.97
print (grep(/\d/,@{$current_month[-1]}))[-1];
0078デフォルトの名無しさん2011/10/30(日) 20:50:38.36
一週間は7日固定で作られていて、最終週の後半は undef で
埋まっているに一票。
0079デフォルトの名無しさん2011/10/30(日) 22:30:04.75
>>78
今日はもうコードをチェックしませんが、恐らく真理です……。
calendarモジュールから取得した日にちデータを、
実際のカレンダーのように、日〜土までを一行として表組みしてます。
仮に月曜日でその月が終わるとすると、火〜土までは空白セルとして表示するようになってます。

……とすると配列の最後尾にアクセスするんじゃなくて、
undefでない最後の有効値にアクセスするように書けばいいってことですよね。
いちいちループ使ってその配列の後ろからundefかそうでないかを調べていったほうが早いでしょうか。
一発で最後の有効値にアクセスする方法ってあります?
0080デフォルトの名無しさん2011/10/30(日) 22:39:28.14
>>79
77氏がその質問を予見してて、答えの一案を書いてるだろ。
0081デフォルトの名無しさん2011/10/30(日) 23:04:38.66
undef かもしれないものに直接 /\d/ はダメじゃね
use strict; use warnings; もしてないであろう>>79なら平気かしらんが
0082デフォルトの名無しさん2011/10/31(月) 00:22:08.94
>>73
続・初めてのPerl 改訂版
まるごとPerl! Vol.1

それに腐っても鯛、
プログラミングPerl 第3版
は、読む価値がある
でもその前に
プログラミングPerl 第2版
を薦めておく
0083デフォルトの名無しさん2011/10/31(月) 00:27:31.33
オライリーだからいいって言ってるだけで
実際は読んでないんだろうなw
0084デフォルトの名無しさん2011/10/31(月) 01:41:52.11
>>79
欲しいのは「二次元配列の最後の(undefではない)要素の値」なのか、
「その年・月の末日の日付」なのか、どっち?

後者ならその配列の値を参照する以外にも取得方法はあると思うが。

use Date::Calc qw(Days_in_Month);
print Days_in_Month($year,$mon);

とか。

まあ>>77の方法でもいいだろうけど。
0085デフォルトの名無しさん2011/10/31(月) 03:05:19.57
Imager.pmで画像のリサイズをしています。
例えば、480×320pxの画像を、400×400pxの枠内に収めたいとき、
cropするだけだと、400×300pxとなってしまいます。
これを、上下50pxずつ白い背景を付け足して、400×400pxの画像に
したいのですが、方法をご存知の方がいたら是非教えてください。
0086デフォルトの名無しさん2011/10/31(月) 04:48:48.11
>>79
俺だとこうするかなぁ。行頭の空白全角にしてるけど:

my $last_day = (
  grep { defined $_ }
  map { @{$_} }
  @current_month
)[-1];
0087デフォルトの名無しさん2011/10/31(月) 08:37:42.50
>>18
Data::Dumperは出力結果をevalすると元に戻るというのも趣旨の1つ。
そのため、元がテキスト文字列だったものをevalしてもテキスト文字列
に戻るように、"\x{ff84}"という記法で出力している。
0088デフォルトの名無しさん2011/10/31(月) 12:31:48.72
>>77 >>84 >>86
ありがとうございました。
>>86の方法で解決です。

ちなみにuse strict;use warnings;どっちもしてます。
0089デフォルトの名無しさん2011/10/31(月) 13:28:43.74
use warnings して warnings の出力ちゃんと見てればあんな質問する前に原因に気づけてるはずなんだよ……
大方、CGI でしか動かしてなくてしかも CGI::Carp を使ったデバッグすらしてない、とかなんだろうけど。
0090デフォルトの名無しさん2011/11/01(火) 17:59:02.82
perlのソート関数ってどんなソート方法が使われているんですか?
1000個の配列を大きい順に並びかえるようなソートだと
自作関数だと1000*1000回のループになっちゃうんだけど、これより速いですか?
0091デフォルトの名無しさん2011/11/01(火) 18:01:00.07
訂正:1000*(1000ーn)回のループです
0092デフォルトの名無しさん2011/11/01(火) 18:21:27.17
http://perldoc.perl.org/functions/sort.html
http://perldoc.perl.org/sort.html
0093デフォルトの名無しさん2011/11/03(木) 00:28:27.70
#!/usr/bin/perl -w

use encoding "utf8"
use Encode;
use strict;

print encode('shiftjis',"テストテスト");

こんな感じのソースを書いて、UNIXサーバに送って
TeraTerm(SJIS設定)で実行すると文字化けする
んですが、何が問題なのでしょう?

TeraTermをutf8設定にして、encodeなしでで表示させれば、
うまく表示されるんですが、SJISのファイルが多いので、TeraTermの
設定はSJISにしておきたいと思っています。

もちろん上記ソースはUTF8で保存してます。





0094デフォルトの名無しさん2011/11/03(木) 00:53:08.42
http://blog.livedoor.jp/dankogai/archives/51221731.html

use encoding;は、jperlなど、かつて存在したL10Nされたperl用に
書かれたレガシースクリプトを、モダンperlで動かすときのためのおまじないです。

スクリプトはUTF-8で書き、use utf8;する
のがモダンPerlのあり方です。
0095デフォルトの名無しさん2011/11/03(木) 01:15:50.78
>>94
おー ありがとうございます。
ソースが職場なので、あとで確認してみます。

この辺の漢字圏の文化を踏まえたPerlの本が
あると良いのですけど、ありませんかね?

0096デフォルトの名無しさん2011/11/03(木) 01:28:38.23
漢字とか知らないけど
モダンperlについて調べたほうがいい。
ネットは古臭いコードで溢れてる。
0097デフォルトの名無しさん2011/11/03(木) 01:38:26.41
ユーザが繰り出すモジュールで最先端が変化するってのも
これまた奇特な言語だな
0098デフォルトの名無しさん2011/11/03(木) 02:28:27.58
Perlは管理する団体がないからね。
Perlの標準ライブラリとは、ユーザが作ったモジュール。
それが利点でもあるが、メンテナが一個人だったりするわけで
その人の気分で仕様が変わり、互換性が低い部分がある。
0099デフォルトの名無しさん2011/11/03(木) 03:51:43.51
CJKV日中韓越情報処理 ケン ランディ、小松 章、逆井 克己
文字コード「超」研究 改訂第2版 深沢千尋

まだあるけどね
0100デフォルトの名無しさん2011/11/03(木) 10:42:18.14
Windows 2000、Activeperl 5.8 の環境で、
use Socket;
socket(・・・);
connect(・・・);
な感じでインターネット上のwebサイトからページを取得してるんだけど、
サイトの応答が遅いとき、応答が帰ってくるまでCPU負荷が100%近くになる。

これって何が原因でしょうか。
まあ、PCのスペックはWin2000を使っているというあたりで想像いただけるとは思いますがしょぼいです。

Activeperlのバージョン上げれば直るのかな…
0101デフォルトの名無しさん2011/11/03(木) 15:09:06.33
>>83
お薦めだけでも300冊位思いついちゃってレスがまんどくさく
なっちゃったんだろうなw
■ このスレッドは過去ログ倉庫に格納されています