1read 100read
2011年12月1期プログラム31: Perlについての質問箱 49箱目 (446) TOP カテ一覧 スレ一覧 2ch元 削除依頼
・ 次のスレ
32: 強いAI(人工知能)ver0.0.1 (529)
33: IS<インフィニット・ストラトス>総合 (107)
34: Google Chrome (3)
35: Visual Studio 総合 Part17 (707)

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


1 :11/10/30 〜 最終レス :11/12/09
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辺り

2 :

               Perlは死んだ

3 :

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

4 :
[プログラミング自体の経験が無い奴はまずココを読め]
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/

5 :
今は日本語処理はEncodeモジュール一択
Jcode関係は過去のやり方です。

6 :
[モジュール]
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

7 :
# [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 でエンコードする必要があります。

8 :
なんかへんなのに割り込まれちった。まあいいや。

9 :
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

10 :
1レスで理解できるutf8フラグ
utf8フラグとい名前がまずかったね。
文字列フラグなどという名前だったらよかった。
文字列フラグはPerl固有のものだから
Perlコード外部から渡されるのは文字列ではない。
文字列でなかったらなにか?それはバイナリ。
バイナリを文字として扱いたければ、文字に変換しないといけない。
それがdecode。
ではソースコードに書いてあるのは、文字かバイナリか。
それはuse utf8を使えば文字で、そうでない場合はバイナリ。
話はこれだけ。

11 :
use Encode;
while(<>){
  chomp;
  my @row = split(/,/, $_);
  for my $row (@row){
    Encode::from_to($row,'utf8','sjis');
    print $row;
  }
}

12 :
古いPerlにまどわされないために
モダンPerlの世界へようこそ
http://gihyo.jp/dev/serial/01/modern-perl/0001

13 :
バイナリと文字列は同じものなので区別なく扱えるのがUNIXやPerlの利点。
Windowsだとそうはいかない。

14 :
> バイナリと文字列は同じものなので
文字列には、文字数というものがあるので
文字とバイナリは違います。

15 :
OSに関係なく、少なくとも文字列はバイナリデータに含まれます。

16 :
そしてバイナリデータを文字列のように扱えるのなら覚えることが
減るので利用者として楽です。

17 :
・バイナリ
ビット(バイト)が並んだもの。それ以外に情報を持っていない。
・文字列
バイナリに様々なメタ情報が追加されたもの。
文字コード情報がが固定、もしくは内包されている。
データの終端情報を持っている。
1文字という概念がある。1文字は多バイト、または可変バイトで構成されている。
バイト単位での操作は行わない。

18 :
つまんないこと言ってないで、Data::Dumper 答えてやれよ

19 :
テキストデータとバイナリデータの違いは何かという普遍的な議論へ

20 :
文字列フラグというければ、chr($n) で $n < 255 のときとそうでない
ときでフラグがつく、つかないが変わる、ということからすると、latin-1
リテラルで Unicode 文字列をあらわすというのは今でも、それが perl
の正しい文字列の扱い方ということになるとおもう。

21 :
>>20
日本語でおk

22 :
>>20
だから、そういうへんな挙動がないEncodeモジュールを
使ってくださいと書いてあるんだよ。
http://perldoc.jp/docs/perl/5.8.1/utf8.pod
> utf8::encode($string)
>
> 論理キャラクタを、8ビットシーケンス表現に、PerlのUTF-Xエンコーディングに、
> (適切に)変換します。何も返しません。 Encode::encode_utf8()と同じです。
> 次のことに注意してください。レガシーのバイトエンコーディングを、
> Unicode にする変換に使うべきではありません:そのためには、Encode を使って下さい。

23 :
>>17
そこに書いた「文字列」を「文字列インスタンス」「文字列オブジェクト」
と書換えるのなら構わないけど、一般的な言葉の「文字列」をその定義に
しちまうのはどうよ?
そうでないと今、見えているものが文字列じゃなくなっちゃうぞ。

24 :
> そうでないと今、見えているものが文字列じゃなくなっちゃうぞ。
なんで? データの終端情報は微妙だけど、
ここに書いてある文字を読むためには、ShiftJISという文字コード
まで含めてやっと文字列として読めるだろ?
そしてその1文字が何バイトであるかなんて考えないだろ?

25 :
そもそも紙に手書きしたものも文字列だし、印刷した場合でも文字列。
パピルスに書かれたものも、粘土板に刻まれたものも、木簡に書かれた
ものも文字列と言われてきたのだから、これからもそうしたほうがいい
と思う。
       (それともお前が全部燃やしたいの?)
・(ひとが扱う)文字列
バイナリに様々なメタ情報が追加されたもの。
→ コンピュータ導入前から人間は文字列は使っているわけで、"バイナリ"
 は無関係。コンピュータがデジタルではなった場合も然り。
文字コード情報が固定、もしくは内包されている。
→ 同じ理由で文字コード情報は文字列の定義に関係がない。
データの終端情報を持っている。
→ バイナリデータだって終端情報を持っていることがある。
1文字という概念がある。
→ 確かに。でももしかしたら1文字の概念があやふやだったり、なかったり
 するようなもの(言語?)もあるかもしれない。
1文字は多バイト、または可変バイトで構成されている。バイト単位での
操作は行わない。
→ これまたコンピュータ上/内の話。コンピュータの有無やその構造・方式
 と文字列の定義は無関係。

26 :
>>25
意味がわからん。
今はコンピュータ上の文字の表現の仕方の話だろ。
手書きしたものとか言い出したら、
文字はバイナリではない(分子かなんかカ?w)ということになるだろ。
なに関係ありそうで関係ないものの話持ちだしてんだかw
こいつは頭が悪いと認定してよさそうだ。

27 :
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.
ってあるようにコンピュータは文字を扱うわけではない。

28 :
バイナリだけでは、それを文字として認識することは不可能。
文字コード情報が別に必要になる。
ASCIIだって、ASCIIコードという情報がなければ、
アルファベットですら文字として認識できない。
たとえばASCIIコードでABCDと書いてあるように見えても、
これはASCIIではなくUTF32ですといわれれば別の文字になるしね。
文字を文字として認識するためには、文字コード情報が必要不可欠。
C言語とかこの文字コード情報が文字列にくっついていないから
(そもそもC言語には文字はあっても文字列はないんだが)
文字として表示するためには人間が文字コードのことを考慮する必要があった。
最近の言語では、文字とバイナリは区別され、文字には文字コード情報が内包されている。
そのため、人間がいちいち文字コードは何か? と考える必要がなくなった。
PerlのUTF8フラグもその一つ。

29 :
>>27
中途半端に持ってくるなよ
基本的に、コンピュータは数字だけを扱います。彼らはそれぞれに番号を割り当てることによって、
文字や他の文字を格納する。ユニコードが発明される前に、これらの番号を割り当てるための
さまざまなエンコーディングシステムの何百ものがあった。単一の符号化に十分な文字が含まれていないことができます:
例えば、欧州連合(EU)だけではそのすべての言語をカバーするいくつかの異なるエンコーディングが必要です。
であっても英語のような単一言語の単一の符号化は、共通使用されているすべての文字、句読点、技術記号のための十分でした。
お互いに、これらの符号化システムは、また競合。つまり、二つのエンコーディングは、2つの異なる文字に対して同じ番号を使用して、
または同じ文字に異なる番号を使用することができます。任意のコンピュータ(特にサーバ)さまざまなエンコーディングを
サポートする必要があります。まだいつでもデータが異なるエンコーディングやプラットフォーム間で受け渡され、データは常に破損の危険性を実行される。

30 :
>>29からも解るように、
「2つの異なる文字に対して同じ番号」を割り当てるわけ。
つまり番号からでは、どの文字かどうかはわからない。
そこで使用されるのが、エンコーディング(文字コード)
番号を文字として認識するには、文字コード情報が必要不可欠

31 :
ここがPerlスレなのは承知してるけど、文字列はPerlだけのものじゃないだろ?
例えばPerlで処理した後にPythonで処理したり、お前の母ちゃんが処理したり
することもあるだろ?

32 :
>>31
そういう場合は文字を一旦バイナリに変換する。
そして他の言語でバイナリとして読み取ったものを
その言語用の文字列として変換するんだよ。

33 :
どうしてもバイナリと対比させたいんだなw

34 :
お前の母ちゃんバイナリ扱えるのか、ちょっと感心した。

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

36 :
だからコンピュータに自動判定させるなって。

37 :
コンピュータは文字(文字列も)扱えないんだからさ。

38 :
>>37
そんな事言ってるのはお前だけw

39 :
文字(文字列)を扱っているのはお前で、お前のコンピュータが文字を
扱っているわけではない。もし今会話している相手がコンピュータ
だっていうならチューリングテスト合格だと思うぞ。

40 :
コンピューター一般においての文字列(テキストデータ)として話してる人と、
プログラミング言語での文字列型に格納されてる文字列について話してる人がいるかかみ合わないのでは?

41 :
perlのutf8フラグの話が発端なんだから
プログラミング言語での文字列型に格納されてる文字列
以外の話をしている人は、なんなんだろうね。

42 :
(△△△クラスの)文字列オブジェクトって言ってくれれば、言っている
ことにすべて同意する。

43 :
>>42
ここはperlスレ。
perlにおいて文字列オブジェクトとは
変数の値にUTF8フラグがついたもの。

44 :
>>41
格納される前は、格納されるものを何て呼べばいいの?
そこを議論しているつもり。
確かに格納される前の話はPerlと無関係かもしれないけれど、説明したり
するときにどうしてもそれを表わさないといけないよね?

45 :
つ ソース文字列

46 :
A) 文字列にはソース文字列が格納されている
B) 文字列オブジェクトには文字列が格納されている

47 :
文字列にはリテラルの語感があるので、A) が不自然に感じる。

48 :
>>44
これでも読んでください。
http://perldoc.jp/docs/perl/5.10.0/perlunitut.pod
・テキスト文字列(文字の文字列)
テキスト文字列、または 文字の文字列 は文字からなります。
バイト列はここでは無意味で、エンコーディングがあります。 各文字は単に文字です。
テキスト文字列は Unicode 文字列 とも呼ばれます; なぜなら、Perl では テキスト文字列は Unicode 文字列だからです。
・バイナリ文字列(バイト文字列)
バイナリ文字列、または バイト文字列 はバイト列からなります。
ここでは、文字はなく、単にバイトだけがあります。
外側の世界(現在の Perl プロセスの外側のあらゆるもの) との通信はバイナリで 行われます。
・エンコード
エンコード は テキスト から バイナリ への変換です
・デコード
デコード は バイナリ から テキスト への変換です。

49 :
質問:二次元配列の、最後の配列要素の最後の要素を参照するにはどうすればいいでしょうか。
例:
@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]は使えないみたいですし……。
ご教授お願いします。

50 :
なんてことはない、
B) ≒ C) 文字列変数に文字列が格納されている
ってこと。
Perlの場合は文字と数値を区別しない変数なので文字列変数ってもの
がなかったわけで、ついでにバイナリストリングと文字列の区別も
なかった。区別がない方が便利なこともあるし、システム的に区別が
あった方が便利なこともある。
でも入れるものと入れられるものを区別できないと困るし、単語が
今までの用法と異なるのも混乱の元。

51 :
print (@{$array[-1]})[-1];

52 :
print $array[-1][-1];

53 :
arrayって
あ〜れぇ〜って読むの?
それとも、ありぃ〜?って読むの?

54 :
アレィ

55 :
A') 数値にはソース数値が格納されている
B') 数値オブジェクトには数値が格納されている
数値にはリテラルの語感があるので、A') が不自然に感じる。

56 :
変数に数値(数値オブジェクト)が格納されている。
変数にバイナリ値が格納されている。
変数に文字列が格納されている。
これでいいじゃん

57 :
>>51
>>52
ありがとうございます。
[-1]だと何故かダメなんです。表示されません。

58 :
>>57
-1 が使えない状況がおかしい。
使えないというコードそのままさらしてみ?

59 :
>>56
格納される前は?
これから格納しようかと思っているものの名称は?

60 :
>>59
要するに変数の右辺だろ?
変数に入れたからって、右辺の状態が
変更されるわけ無いだろ。
変数に入れるまでもなく、
数値、バイナリ値、文字列、ついでにオブジェクトだよ。

61 :
×要するに変数の右辺だろ?
○要するに変数への代入式の右辺だろ?

62 :
右辺といってる時点でもうスクリプトの中の話になってるしw

63 :
え? スクリプト外?
なら答えは>>48に書いてあるじゃん。
> 外側の世界(現在の Perl プロセスの外側のあらゆるもの) との通信はバイナリで 行われます。
はい、バイナリです。

64 :
おれ、この流れすきwww

65 :
スクリプトの外には出たものの、まだコンピュータの中だな。
がんばれ!!!

66 :
>>65
お前何のはなししてるの?

67 :
1レスどころか66レスまでひっぱるutf8フラグ

68 :
utf8フラグがあるべきところ

69 :
{
no utf8;

70 :
おまえらいいかげんにしろ
文字の話は↓こっちに移ったんだろうがよ
Perlについて
http://hibari.2ch.net/test/read.cgi/tech/1217851121/

71 :
>>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]";
""を外してみてもダメでした。

72 :
calendar が1次元配列で返せば解決

73 :
「初めてのPerl 第3版」(ちょと古い)をひと通り読んで、
モジュールの作り方とか載ってないので、次の本を探
しています。
だいたいPerlの書き方はわかったので、リファレンスを
兼ねた本がいいと思い、「プログラミングPerl 第3版」
を検討していますが、内容的には古くないでしょうか?
2002年というのがどうにも気になりまして。
あとできればマルチバイト文字にも配慮した本だと
いいのですが望み薄ですか?
shiftjisのテキストファイルを扱うときに、日本語処理に
随分手間取ったので。(Encodeモジュールを使いました)

74 :
>>72
週ごとに区別する都合で2次元配列なんです。
いろいろ手間をかければ月の最終日が何日なのかは参照できると思いますが、
一発でアクセスできる方法があればなと……。

75 :
@{$current_month[-1]} は最終週を返しているか確認した?

76 :
use Data::Dumper ;
して、
print Dumper \@current_month ;
の結果が想定通りかまず調べろ。
実際には一次元が返ってたとか、undef が
返ってたとかあるだろ。

77 :
print (grep(/\d/,@{$current_month[-1]}))[-1];

78 :
一週間は7日固定で作られていて、最終週の後半は undef で
埋まっているに一票。

79 :
>>78
今日はもうコードをチェックしませんが、恐らく真理です……。
calendarモジュールから取得した日にちデータを、
実際のカレンダーのように、日〜土までを一行として表組みしてます。
仮に月曜日でその月が終わるとすると、火〜土までは空白セルとして表示するようになってます。
……とすると配列の最後尾にアクセスするんじゃなくて、
undefでない最後の有効値にアクセスするように書けばいいってことですよね。
いちいちループ使ってその配列の後ろからundefかそうでないかを調べていったほうが早いでしょうか。
一発で最後の有効値にアクセスする方法ってあります?

80 :
>>79
77氏がその質問を予見してて、答えの一案を書いてるだろ。

81 :
undef かもしれないものに直接 /\d/ はダメじゃね
use strict; use warnings; もしてないであろう>>79なら平気かしらんが

82 :
>>73
続・初めてのPerl 改訂版
まるごとPerl! Vol.1
それに腐っても鯛、
プログラミングPerl 第3版
は、読む価値がある
でもその前に
プログラミングPerl 第2版
を薦めておく

83 :
オライリーだからいいって言ってるだけで
実際は読んでないんだろうなw

84 :
>>79
欲しいのは「二次元配列の最後の(undefではない)要素の値」なのか、
「その年・月の末日の日付」なのか、どっち?
後者ならその配列の値を参照する以外にも取得方法はあると思うが。
use Date::Calc qw(Days_in_Month);
print Days_in_Month($year,$mon);
とか。
まあ>>77の方法でもいいだろうけど。

85 :
Imager.pmで画像のリサイズをしています。
例えば、480×320pxの画像を、400×400pxの枠内に収めたいとき、
cropするだけだと、400×300pxとなってしまいます。
これを、上下50pxずつ白い背景を付け足して、400×400pxの画像に
したいのですが、方法をご存知の方がいたら是非教えてください。

86 :
>>79
俺だとこうするかなぁ。行頭の空白全角にしてるけど:
my $last_day = (
  grep { defined $_ }
  map { @{$_} }
  @current_month
)[-1];

87 :
>>18
Data::Dumperは出力結果をevalすると元に戻るというのも趣旨の1つ。
そのため、元がテキスト文字列だったものをevalしてもテキスト文字列
に戻るように、"\x{ff84}"という記法で出力している。

88 :
>>77 >>84 >>86
ありがとうございました。
>>86の方法で解決です。
ちなみにuse strict;use warnings;どっちもしてます。

89 :
use warnings して warnings の出力ちゃんと見てればあんな質問する前に原因に気づけてるはずなんだよ……
大方、CGI でしか動かしてなくてしかも CGI::Carp を使ったデバッグすらしてない、とかなんだろうけど。

90 :
perlのソート関数ってどんなソート方法が使われているんですか?
1000個の配列を大きい順に並びかえるようなソートだと
自作関数だと1000*1000回のループになっちゃうんだけど、これより速いですか?

91 :
訂正:1000*(1000ーn)回のループです

92 :
http://perldoc.perl.org/functions/sort.html
http://perldoc.perl.org/sort.html

93 :
#!/usr/bin/perl -w
use encoding "utf8"
use Encode;
use strict;
print encode('shiftjis',"テストテスト");
こんな感じのソースを書いて、UNIXサーバに送って
TeraTerm(SJIS設定)で実行すると文字化けする
んですが、何が問題なのでしょう?
TeraTermをutf8設定にして、encodeなしでで表示させれば、
うまく表示されるんですが、SJISのファイルが多いので、TeraTermの
設定はSJISにしておきたいと思っています。
もちろん上記ソースはUTF8で保存してます。

94 :
http://blog.livedoor.jp/dankogai/archives/51221731.html
use encoding;は、jperlなど、かつて存在したL10Nされたperl用に
書かれたレガシースクリプトを、モダンperlで動かすときのためのおまじないです。
スクリプトはUTF-8で書き、use utf8;する
のがモダンPerlのあり方です。

95 :
>>94
おー ありがとうございます。
ソースが職場なので、あとで確認してみます。
この辺の漢字圏の文化を踏まえたPerlの本が
あると良いのですけど、ありませんかね?

96 :
漢字とか知らないけど
モダンperlについて調べたほうがいい。
ネットは古臭いコードで溢れてる。

97 :
ユーザが繰り出すモジュールで最先端が変化するってのも
これまた奇特な言語だな

98 :
Perlは管理する団体がないからね。
Perlの標準ライブラリとは、ユーザが作ったモジュール。
それが利点でもあるが、メンテナが一個人だったりするわけで
その人の気分で仕様が変わり、互換性が低い部分がある。

99 :
CJKV日中韓越情報処理 ケン ランディ、小松 章、逆井 克己
文字コード「超」研究 改訂第2版 深沢千尋
まだあるけどね

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
・ 次のスレ
32: 強いAI(人工知能)ver0.0.1 (529)
33: IS<インフィニット・ストラトス>総合 (107)
34: Google Chrome (3)
35: Visual Studio 総合 Part17 (707)