トップページ⇒php
626コメント198KB

【Perl上級者コーナーPart01】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/06/22 19:21ID:V3u7Ppd0
勃っちゃた
0421nobodyさん2006/10/10(火) 20:26:03ID:???
超絶的確な>>416のレスを読まない
>>414に萎え

てか、文字コードの違いもわからず上級者気取りか・・・
0422nobodyさん2006/10/10(火) 22:14:51ID:???
もうおわったことにぐだぐだいってる >>421 のしつこきもちわるさにほげ
0423nobodyさん2006/10/12(木) 14:25:18ID:???
一応天才って言われるけど…これ常套だべ?

BEGIN {
$vo = '栄昇';
$g = '優';
$pf = '等';

}
コードに入れてない奴は今すぐ入れたほうが良いよ、平和になるし
0424nobodyさん2006/10/12(木) 16:16:15ID:???
日本語でok
0425nobodyさん2006/10/14(土) 00:22:11ID:???
上級者専用スレなんて初めて開いた・・
Gimpって画像処理ソフト、CGIから操るのに成功した人っています?
ImageMagickを使ってみて、なかなか面白いんだけど、文字の加工は貧弱なので
Gimp試してみたものの、全然動かないのです。
0426nobodyさん2006/10/14(土) 00:26:36ID:???
>>425
キサマには初心者スレすら生ぬるい。
0427nobodyさん2006/10/14(土) 00:38:50ID:???
煽りに用はない!by ken
0428nobodyさん2006/11/14(火) 14:47:50ID:M1pI9RkN
>>420
では上級者的指摘を

use utf8環境下でsubstrで2文字取り出すというのがどういう意味なのか
分からないのがお前の敗因。
我々上級者はuse utf8はuse byte;は併せて覚えている。

つ〜かcryptの第2引数は初めの2バイト以外無視する仕様だから
わざわざsubstrしてる時点で中級者とも言えない。

って、全くテストもしないで亀レスだけしてみる。
0429nobodyさん2006/11/15(水) 07:29:44ID:???
cryptはDESかMD5かで有効なsaltの文字数が違うよ
0430nobodyさん2007/01/24(水) 20:02:36ID:???

簡単にお金稼ぎ!!!

以下の手順でやれば、無料でお金稼ぎができます。
企業も広告の宣伝になるから、お金をくれるわけです。
最初の1日目で 2000 円〜3000 円 は確実に稼げます。
実際の作業は数十分程度、1時間はかかりません。

(1) http://pointdream.jp/member_regist.aspx?LinkID=577583#.2ch.net/
   ↑このアドレスからサイトに行く。
(2)無料会員登録をする。
 ※フリーメールアドレスでもOK。
(3)ポイントを稼ぎます。
 懸賞の応募や無料会員登録をすればするほど、
 ポイントが貰えます。
(4) 友達を増やせば、後は何もしなくても
 定期的に、友達還元ポイントがドッサリ入ってきます。

これで現金を稼ぐといいですよ!!!

登録(応募)はこちらから↓
http://pointdream.jp/member_regist.aspx?LinkID=577583#.2ch.net/
0431nobodyさん2007/02/10(土) 20:43:16ID:???

簡単にお金稼ぎ!!!

以下の手順でやれば、無料でお金稼ぎができます。
企業も広告の宣伝になるから、お金をくれるわけです。
最初の1日目で 2000 円〜3000 円 は確実に稼げます。
実際の作業は数十分程度、1時間はかかりません。

(1) http://blackjack.lxl.jp/#.2ch.net
   ↑このアドレスからサイトに行く。
(2) ゲットマネー登録サイトに移動するので、
 そこで無料会員登録をする。
 ※フリーメールアドレスでもOK。
(3)ポイントを稼ぎます。
 懸賞の応募や無料会員登録をすればするほど、
 ポイントが貰えます。
 他にも沢山種類があるので、1日目で
 約 20000 ポイントは GET できます。
(4) 10000 ポイントから、現金に交換できます。
(5)キャッシュバックという所がありますので、
 そこから交換をしましょう。

これで現金を稼ぐといいですよ!!!

無料会員登録はこちらから↓
http://blackjack.lxl.jp/#.2ch.net
0432nobodyさん2007/03/26(月) 17:41:13ID:3MEiX5hy
上級者向けの質問かどうか分からないけれど、他に該当スレが思いつかなかったのでここで質問させてください。

CPANで落とせるNet::SMTP_authってモジュールがあって、それはNet::SMTPのサブクラスになっていて
ソースの中ではauth()とauth_types()のオーバーライドしかしていない。
SMTP_authでメール送信するには587番ポート使う筈で、それはnew()したときの
最初のサーバへの通信で既に「587を使う」と指定しないといけないと思うのだけど
どこをどう探してもその記述が見つからない。
NET::Configの中かなぁと思ったのだけど、それも違うっぽい。
どうやって587ポートを指定させているか、誰かご存知の方いませんか?

SMTP_authモジュールを使いたくて色々調べていたらこの問題に行き着いて、どうにも納得できなくて気持ち悪いので
ヒントだけでも教えていただけると嬉しいです。
0433nobodyさん2007/03/26(月) 22:13:50ID:sZyxWGW4
>>432
Authen::SASLで何やってるかわかんないけど、ポート指定してるっぽいのはここだね。

my $conn = $sasl->client_new("smtp", $host);#, "noplaintext noanonymous");

0434nobodyさん2007/03/26(月) 23:55:40ID:???
>>432
> SMTP_authでメール送信するには587番ポート使う筈
これ間違い。

○ submission portを使用するときはSMTP AUTHが必要。
0435nobodyさん2007/03/27(火) 20:09:45ID:???
Net::SMTP->new( Port=>587 );

Net::SMTPなら、こんなんじゃなかったっけ
04364322007/03/30(金) 15:34:09ID:???
>>433
ありがとうございます。
まだ色々分かって無いですが、また調べてみようと思います。

>>434
まだ理解が足りていなかったみたいです
ご指摘ありがとうございます。

>>435
そうですよね、やっぱし。
でも587というポート番号を指定してる場所がどこにもなくて「あれ?おかしくね?」
と感じて調べ始めたら泥沼に、、、orz
0437nobodyさん2007/04/02(月) 21:36:14ID:???
OP25Bなら、サブミッションポートで接続してSMTP AUTHするわけだから
ポートは自分で設定する必要があるよ。
0438nobodyさん2007/06/19(火) 22:29:14ID:Ye7oVo0e
Perlに触れて2ヶ月余りの者ですが皆様のお知恵を拝借したい事があります。
フォームを作成し、大量の文字を入力してメールを送信するようにすると、
500文字目辺りが文字化けしてしまいます。
その部分から一定の周期で文字化けが発生しています。
300文字程度までなら全然平気なのですが。。
あとそのメールのログをとっているんですけどログの方は大量に文字をうっても問題なく蓄積されていました。
この事からプログラム的な問題ではなく、
鯖にインストールされている sendmail が怪しいかと思うのですが、
バージョンが古いとこのような問題が起こる等、何らかの情報はご存知ないでしょうか??
宜しくお願い致します。
0439nobodyさん2007/06/20(水) 00:03:45ID:???
>>438
2ヶ月で上級者になるとは凄い才能だね。では頑張れ。
0440nobodyさん2007/06/20(水) 00:59:21ID:???
>>439
低級者のレスはいりません
0441nobodyさん2007/06/20(水) 01:26:40ID:???
>>438
一行に500文字が入っているの?
SMTPの仕様だか、実装だかに一行の最大文字数みたいな制限があったはず。
途中に改行入れていて500文字だったらスマン、わからん。
0442nobodyさん2007/06/20(水) 06:41:47ID:???
>>441, >>443-
低級者のレスはいりません。
04434382007/06/20(水) 10:56:39ID:???
>>441
どうやらビンゴのようです。
改行入れると化けません。
SMTPの仕様でしたか。。。
この仕様について色々と調べてみたいと思います。
大変参考になりました、ありがとうございます!
04444382007/06/20(水) 13:04:00ID:???
完全に文字化けが直りました。
>>441さんに多謝!
0445 ◆lVJAPUTeX. 2007/07/24(火) 21:05:58ID:???
>>441

RFC2822によれば、CRLFを入れて1000文字 (オクテット) ですね。
Sendmailでは長い行を自動的に分割します。
500文字というのはShift_JISで書かれた日本語での換算かな?

…とここまで書いて1ヶ月前の記事ってのに気づいた。まあいいや。
0446nobodyさん2007/08/19(日) 05:01:02ID:LoxscrBM
Perlからメールアカウントの追加をしたいんですが、どうやったらええんでしょ?
MTAはqmailでvpopmailでバーチャルドメイン運用してます。

root権限もあります。
perlからの会員登録と同時にメールアカウント作成みたいなもんをしたいんですが。
04474462007/08/21(火) 17:15:45ID:HBIrwO1t
誰か〜〜

助けておくれ><;
0448nobodyさん2007/08/21(火) 19:24:10ID:???
UNIXユーザーか仮想ユーザーか、自力でシミュレートして登録するか
外部コマンドを利用するか等で実現方法が変わる。

外部コマンド使う場合
・パイプ、system関数 or バッククォートで外部コマンドを実行
・uidをrootにしsetuidする
・強制的にテイントモードになるのでサニタイズする
ここら辺注意すれば比較的簡単に出来ると思う。
04494462007/08/23(木) 03:02:56ID:i/ueFIKi
>>448
ありがとうございます。
おかげさまで解決しました。
Insecure $ENV{PATH} while running setuid at ./hoge.cgi line xx.
というエラーが出て少し悩みましたが。
04504462007/08/23(木) 22:35:13ID:i/ueFIKi
すいません。もう一つ質問です。

setuidでroot権限で実行する方法なんですが、mod-perlだとroot権限になりませんね。
できればmod-perlで動かしたいんですが、方法はあるんでしょうか?

0451nobodyさん2007/08/24(金) 06:17:27ID:ZilCg/Oy
これはまたひどい後出し
0452nobodyさん2007/08/24(金) 13:37:27ID:???
>>450
mod_perlの動作原理をちょっと考えればわかることだが、不可能
0453nobodyさん2007/08/24(金) 17:19:07ID:???
・BIGSECURITYHOLEオプションでapacheをrootで動作させる。
・外部コマンドを実行するプログラム(setuidされた)をmod_perlから呼び出す。
・sudoを使う
思いつくのはこんぐらいかな。
04544462007/08/24(金) 23:47:48ID:IBL+ZrlN
>>453
ありがとうございます。
apacheをrootで動かすのは怖くてできません><;

2つ目のプログラムを分けてmod-perlから呼び出すプログラムに数値を渡すにはファイル書き込みか何かで渡す他ないんですよね?
これならできそうです。

3つ目のsudoは
perlプログラム内(test.cgi)に以下の外部コマンド
`script /dev/null -q -c 'sudo -u root /home/vpopmail/bin/vadduser -r hoge\@hogehoge.com'`;

visudoにて以下を追加
apache ALL=(root) NOPASSWD: /var/www/test.cgi

で実行してみましたが、secureログには
sudo: pam_unix(sudo:auth): authentication failure;
と出ます。sudoがシンプルで良いと思っているのですが、認証失敗は何が原因でしょうか?
04554462007/08/24(金) 23:57:13ID:IBL+ZrlN
あ。test.cgi自体をsudoで動作させなきゃ意味ないですよね。
どうしたらtest.cgiをsudoで動作させられるんでしょう?><;

0456nobodyさん2007/08/25(土) 02:55:37ID:???
それはperlと関係ない話だからなぁ
sudoでググれば普通にわかるべ

つーか、そもそもmod_perl使わなきゃいいだけの話じゃないのか?
そんな何回も実行するようなもんじゃないし、危ない橋を渡ることもあるまいに
04574462007/08/25(土) 03:35:05ID:YKfJDMUn
あ。解決しました。
visudoには
apache ALL=(root) NOPASSWD: /home/vpopmail/bin/vadduser
ですね。

教えてくださった方々ありがとうございました。
0458nobodyさん2007/08/25(土) 07:04:35ID:uu0LXyl+
http://icomu.jp/96216/index.php
0459nobodyさん2007/08/25(土) 08:17:45ID:XkW9fGs3
http://inoken.tv/?RF=1&frdref=130729
0460nobodyさん2007/10/08(月) 21:00:42ID:???
さげさげ
0461nobodyさん2009/01/21(水) 20:58:10ID:???
ほ
0462NET2009/05/08(金) 13:33:02ID:amX8/mpj
while(1){
print "Perl上級者コーナー";
$key = <STDIN>;
chop $kay;
print = "What's your name?\n;
print = "I'm $key*100 \n;
}

13歳が何もみないでかいてみた><
0463nobodyさん2009/05/08(金) 13:37:20ID:???
13歳にしてはがんばったな
0464nobodyさん2009/05/08(金) 14:22:44ID:???
他の所の突っ込み処は置いといてchopってなんかおっさん臭がするんですが
0465nobodyさん2009/05/11(月) 00:38:49ID:???
mがないとおっさん?
0466nobodyさん2009/05/13(水) 10:55:08ID:???
チョンぷがあるのにchopは無ぇだろっていう’
0467nobodyさん2009/05/13(水) 16:57:23ID:???
chopも含めての釣りだろjk。
0468nobodyさん2009/05/16(土) 13:18:58ID:???
敢えて釣られてやるのも大人の仕事だよ、ぼうやw
0469nobodyさん2010/03/14(日) 01:13:19ID:7f+5rOkc
あげ
0470nobodyさん2010/09/12(日) 09:52:33ID:???
釣られてる割には偉そうな上にレベルが低いでつね
たかがwebごときで、っていうことはないんだけど
何かしらに依存したwebしかできないのに自称プログラマとか言ってる奴はshine
せめてwebとか接頭辞つけなさい
大概webプログラマって馬鹿ばっか

chopの方が早いし負荷もかからないもんなの
一般レベルの脳があれば推測できる問題
chompは$/とマッチという手順を踏むから

windowsなんて無視無視

スクリプターって基本的に馬鹿だから共用のレン鯖とかでいらぬリソース食うぐらいしか脳がないんじゃねーの?
その脳で素敵CGIスクリプトです!って糞コード延々と書きやがるから始末におえない

ところで上級者コーナーじゃないの?ここ
一年以上経ってるわけだけど>>466とかの頭って少しは修正されてるのだろうか
0471デフォルトの名無しさん2010/10/27(水) 07:25:26ID:5gjOlAXp
PerlをバカにするやつはC言語できないやつ
0472nobodyさん2010/11/01(月) 20:21:33ID:???
C++を勉強すればするほど「バカバカしい、Perlでやれたら」と思う俺はPerlをバカにしていることになるのか
0473Perl忍者 ◆M5ZWRnXOj6 2010/11/01(月) 21:58:30ID:y3OKpJEC
>>470
おめえみたいなカスは一刻も早く死ぬべきだと思うよ
だいたいWebプログラマをバカにするのはまじで
Cオタなんだよ な?お

おめえが書いた糞コードよりかも
そこらへんのクソウェブグラマ我書いたコードのほうが100杯おもしれえんだよ
お願いだから早く死んでくれないかな?今すぐ?ね?お願いお前邪魔消えろ死ねよゴミハゲ失せろカス

リソースくってんじゃねえよおめえは資源の無駄
消えろてか死ねロボットの制御でもやってろよはなくそ消えて?
邪魔だから死ねばお目絵がばかだろ消えろ
お前みたいな目糞鼻糞はゴミなんだよウインドウズばかにしてんじゃねえよごみ
0474Perl忍者 ◆M5ZWRnXOj6 2010/11/01(月) 22:00:03ID:y3OKpJEC
お前リアルだったらまじボコボコになってそうだね
てめえみたいな糞ガリチビがいきがってるとマジ死ねって思うよ
0475nobodyさん2010/12/19(日) 16:48:31ID:VNwU7k7r
負けるな。『Perl忍者』

もっとガンバレ。
0476nobodyさん2011/04/26(火) 13:25:56.35ID:ItQASWDv
chopとchompの負荷比べる馬鹿がいるとは思わなかったわ。

速度の差なんてほとんどないのに行末改行なしのレコードを削ってしまうリスクを犯して
chop推奨するとかマジキチ。
0477nobodyさん2011/04/26(火) 13:42:12.97ID:???
速度ってわめけば上級者っぽくみえますからね
クソどもは
0478nobodyさん2011/04/26(火) 14:22:06.93ID:???
なんで半年前の話に首突っ込んだんだw
0479nobodyさん2011/04/26(火) 21:41:44.32ID:???
>>478
半年振りに来たからにきまってるじゃないか
0480nobodyさん2011/06/13(月) 03:41:02.85ID:OcAQvTJ8
warn AAA::BBB::
ってやったら、AAA::BBB って
表示されたんですが、これはバグですか仕様ですか?

0481nobodyさん2011/06/13(月) 08:09:49.79ID:Akk4alQR
>>480
仕様。パッケージ名とみなされパースされた。
Barewordは使わずクオートで囲うべし。
0482nobodyさん2011/06/13(月) 20:20:33.63ID:OcAQvTJ8
>>481
パッケージ名とみなされて、
パッケージ名の文字列となるのは
仕様なのですか
0483nobodyさん2011/06/14(火) 02:12:21.61ID:sV8LvSOt
>>482
だろうね。
package Foo;
sub new {print "hola¥n"}
Foo::->new();
Foo->new();

あと、
warn AAA:BBB:
とかだとパースエラー出るからパッケージ名のパースが通ってるのは
多分間違いない。
眠いからソースは脳内
0484nobodyさん2011/06/15(水) 00:03:14.60ID:???
>>483
そうなんですかね。

どこにそんな仕様が書いてあるページがあるんだろう?
ネットでググっても見つからないし、
そもそも::でぐぐれないし。

404の人とか、これ見たら教えて
0485nobodyさん2011/06/19(日) 11:35:55.58ID:???
>>484
ダブルコロンを含んだ裸の文字列はパッケージ名以外認められていないので、
それをスカラ値として扱った場合どうなるかといった議論がそもそもあるかどうか
じゃないの?
ないのであれば仕様外のことをしてるので出力が不定になっても仕方ない、それが暗黙の仕様、
なんでそうなるかは>>481ってことでしょ。
0486nobodyさん2011/06/19(日) 12:11:38.53ID:???
はい404乙

こがいおつ


04874852011/06/19(日) 21:03:47.66ID:???
>>486
404ちゃうわw
404が見てるんなら添削して欲しいわ。
0488nobodyさん2011/08/14(日) 11:52:08.32ID:???
>>484

なにその Google脳、怖い...
0489nobodyさん2011/08/20(土) 02:55:40.80ID:e2Pj6teM
初心者スレではレスが付かなかったので、こちらでお願いします。

日本語と英語以外に対応したければ
Encodeモジュールを使うしか無いのでしょうか?

NKFやJcodeは日本語専用ですよね?

みなさんは多言語対応にするとき何を使っていますか?
0490nobodyさん2011/08/21(日) 19:41:44.35ID:???
自分自身が多言語に対応していないのでそういう
アプリを書いたことがない、に一票。

0491nobodyさん2011/08/21(日) 23:04:28.01ID:???
>>490
答になっていないので無効票。
0492nobodyさん2011/08/21(日) 23:51:26.78ID:???
489 が考えている対象言語って何なの?
例えば、中国語だとか韓国語だとか...
それともいきなり全世界ってこと?

ただの興味本位なんだけど、どんなものを
作ろうとしてるのか知りたい

無効票になっちゃったけど興味はあるんだよね
0493nobodyさん2011/08/22(月) 01:18:42.47ID:???
>>492
> 489 が考えている対象言語って何なの?

たぶんPerl。



…すまん、言ってみたかっただけ。

まあ現実的な話としてUnicodeで扱うのが今は
いろんな意味で一番ラクなんでしょうね。
日本語と英語以外を扱わざるを得なくなったことがないし
他に解があるのかは知らないけど。
0494nobodyさん2011/08/22(月) 02:00:28.33ID:???
例えば中国語の場合、中国以外ならUTF-8でいいんだろうけど
当の中国はGB18030なわけで...
そういう例は他にもありそうな気がするしなぁ

Encodeってコード変換用のモジュールだから、UTF-8だけで
処理している分には特に何も使わなくても多言語対応に
なると思う。それよかメッセージを多言語に対応させて準備
するほうがよっぽど大変そうに思える。

ああ、WWW上の自動翻訳機能を呼び出すのか。
0495nobodyさん2011/08/22(月) 02:59:41.07ID:???
ブログとかで最初から最後まで(入力から保存から出力まで)すべて
Unicodeです。とかなら多言語対応も簡単なんだけど、
HTML解釈するプログラムとか、メーラーとか作ろうとすると
Unicode以外の文字コードを扱わないといけなくなるからね。
そうなると必然的にEncode使うことになる。

日本語にしか対応しません。っていうのならいいけどさ、
プログラマとしては諦めるのか?って感じだし、
今は世界から日本にサービス提供される時代でしょ。
そんなんじゃ黒船に対抗できないと思うんだよね。

なれないうちはEncodeモジュールは使いにくいかもしれないけど、
やるかやらないかを検討している時期じゃないと思うよ。
Jcodeとかはもう捨てたほうがいい。
0496nobodyさん2011/08/24(水) 23:32:13.82ID:???
Encodeモジュールが使いにくいのは同意。
モジュール内部のフラグをアプリケーションプログラマが面倒を
見ないとならない。

自分の作っている範囲では「日本語しか対応しません。」で
何も困らない。そもそもWWWアプリケーションを書くことが
あんまり(まったく)なくて、Perlで作るのはほとんどがローカル
環境で動作するテキストフィルタなんで。

だから日本語をちゃんと処理する必要があるけれど、他の言語
例えば韓国語などを処理する必要はまったくない。これからは
多言語の時代だよ、と言われても身の回りには需要がないし、
自分にそもそも外国語のスキルがない。

周りやある程度大雑把に広く見渡しても、バイリンガルだったり、
トリリンガル?のひとは本当に少数なので、多言語対応ソフト
ウェアを作ったり、テストしたりするのがそんなに容易なことなの
かと不思議に思う。

本やWebで薦められているほど、やれる人は多くいないんじゃ
ないかと思ってるけど、どうなんだろう?
0497nobodyさん2011/08/25(木) 03:06:54.04ID:???
>>496
そんなんだから、外国製なのに日本語にも対応している
ソフトやライブラリがどんどん広まるんだよ。

で、最終的に世界中の情報が利用できない。
圧倒的情報弱者になる。
0498nobodyさん2011/08/25(木) 03:12:58.74ID:???
っていうか、本当はEncodeがわからないんじゃなくて
UTF8フラグがわかんないんだよね?

UTF8フラグはPerlの機能だから
これがわからないとPerlがわかってないも同然だよ。

UTF8フラグがわかっていれば、Encodeは
実に素直な設計。
0499nobodyさん2011/08/25(木) 10:37:19.31ID:???
Perlから見れば文字コードは2つしかないよね

UTF8フラグなし → Latin-1
UTF8フラグあり → UTF8
0500nobodyさん2011/08/25(木) 22:03:04.96ID:???
>【UTF8フラグがわかっていれば、】Encodeは
>実に素直な設計。

その前提が怪しいと思ってる。というのは、

>Perlから見れば文字コードは2つしかないよね
>UTF8フラグなし → Latin-1
>UTF8フラグあり → UTF8

のどっちも使わないから。

身近なスクリプト書くのに Latin-1 や UTF-8 が
必要となるのだろうか?

利用者からしてみると後退しているように見えて
しまう。
0501nobodyさん2011/08/25(木) 23:47:39.38ID:???
おいらの理解では、
  符号化方式(US-ASCII or Latin-1 or UTF-8)
と
  utf8フラグの値(on or off)
と
  内部コード or 外部コード
はすべて直交してて、全部で3×2×2=12の組合せが
あり得る(以下の表)

utf8flag internal
-----------------------------------
1. US-ASCII on yes
2. US-ASCII on no
3. US-ASCII off yes
4. US-ASCII off no
5. Latin-1 on yes
6. Latin-1 on no
7. Latin-1 off yes
8. Latin-1 off no
9. UTF-8 on yes
10. UTF-8 on no
11. UTF-8 off yes
12. UTF-8 off no
-----------------------------------
0502nobodyさん2011/08/25(木) 23:52:16.35ID:???
でも実際には発生しない組合せもあるため、状態の遷移が直交
しておらず、今、何になっているのか把握しづらい。

なぜかと言うと、プログラマが相手しているのは、書いている、
あるいは書かれている、静的なコードであるのに対して、上記は
プログラムの実行時に動的に変化するからだ。

これらの状態・動作を確認するという手間は、これまでになかっ
たわけだから、純粋に負担が増えてしまっている。

多言語に対応することに反対してないので、こういう負担が増え
ない方法で行えないものかと思う。
0503nobodyさん2011/08/26(金) 02:37:40.52ID:???
>>501
難しく考えすぎ。難しいと勘違いしているのなら、その原因はutf8(フラグ)という名称についてだけ

Perlには ”Perl文字列”(命名俺)と "バイナリ" の二つしか無い。(数値やオブジェクトはまあとりあえず忘れて)
"Perl文字列"は、その名の通りPerl言語専用の文字列。だからこの文字列をPerlの世界の外に存在しないし、外に出すことはない。
それはつまり、ネットワーク通信やファイル読み書きで外部に流してはいけないということを意味する。

"バイナリ"はただのバイトの並び。ネットワークやファイルから読み取るものは全部"バイナリ"(PerlIOという自動変換機能を使わない限り)
テキストファイルだろうがなんだろうが、それはPerlから見ればただのバイトの並びでしか無い。

Perlにおいて文字列を扱う関数や正規表現は すべて"Perl文字列"を引数に取る。
"バイナリ"も引数にとれるがそれは古いPerlとの互換性用の機能と考える。

じゃあその"Perl文字列"はどうやって作るかというとそれがEncodeモジュール。
ネットワークやファイルから与えられた"バイナリ"をEncodeモジュールを使って"Perl文字列"に変換する。

(utf8::*もあるが忘れていい。utf8.podにはことごとくEncodeモジュールを
使ってくださいと書いてある http://perldoc.jp/docs/perl/5.8.1/utf8.pod)

ちなみにソースコードに書いてある文字列。これもデフォルトでは "バイナリ" 。
互換性のことを考えると理由はわかると思う。use utf8;をするとソースコードの文字は"Perl文字列"になる。

文字コードはたくさんあるが、"Perl文字列"は一種類しかない。Encodeモジュールを使って
いろんな"バイナリ"を"Perl文字列"に変換できる。もちろんその逆も出来る。

US-ASCIIだろうが、Latin-1 だろうが、UTF-8だろうが、Shift-JISだろうが、EUC-JPだろうが
外部にあるものはみんな"バイナリ"。それをEncodeモジュールは"Perl文字列"に変換してくれる
0504nobodyさん2011/08/26(金) 02:38:03.50ID:???
"Perl文字列"の内部の実装がUTF8だとしても、そのことを意識する必要はない。
UTF8フラグという名前が良くないが、これはPerl文字列フラグと読み替えればいい。
Perl文字列フラグがついていればPerl文字列(繰り返すが中身がUTF8なのは知らなくていい)

http://perldoc.jp/docs/perl/5.10.0/perlunifaq.pod
> 内部表現は何か分からないエンコーディングで、常に明示的にエンコードと
> デコードが必要ということにしておいた方がよいです。


だからPerl文字列フラグ付きのUTF8やLatin-1などというものはない。
Perl文字列フラグがついていれば、それはすべて同じPerl文字列。


あとは自分のプログラムは文字列を扱うとき、"Perl文字列"を基本として使うのか(統一された文字のモダンなやり方)
"バイナリ"を基本として使うのか(互換性重視の古いやり方)を決める。"Perl文字列"なら文字と1文字として扱える。
"バイナリ"だとそうはいかない。

Perl文字列を基本として使うなら、Perl外部のネットワーク、ファイルの読み書き時にすぐに変換して
Perl文字列メインでコードを書くことになる。

もし古いモジュールがPerl文字列対応になっていなければ、バイナリに変換して呼び出すラッパーを書くことになるだろう。


反対にバイナリを基本として使うのなら、バイト数ではなく文字数を知りたい時など、
文字として扱いたいところでPerl文字列に変換して関数を呼び出す。
そういうラッパーを書くことになるだろう。


どちらを基本にするかをしっかりと自覚しているのなら、あとはラッパーが変換し、関数を呼び出し、ラッパーがもとに戻す。
ラッパーが違いを吸収して、Perl文字列だろうがバイナリだろうが、自分で決めた基本に統一できるのだから状態を確認する手間はない。
0505nobodyさん2011/08/26(金) 02:38:14.84ID:???
君が望んでいる通り、いろんな組み合わせや状態なんかを考えたくないだろう?
多言語対応で作るとなったとき、プログラムで使う文字はひとつに統一したほうがいいだろう?

それがPerlでは、"Perl文字列"になる。本当はPerl外も巻き込んで一つに統一されたほうが
いいんだけど、統一という言葉に一番近いUnicodeでさえ、文字集合は同じでも、文字を表すビット列には
UTF8、UTF16、UTF32などがある。近いうちに一つに統一されることは無いだろう。

だからPerl外部からPerl内部に渡って来る時の変換機能は絶対になくせない。
(もちろんこのアプリはこの文字コードだけを使いますと決めれば変換機能を
なくせはするだろうけど、それはPerlという言語の開発者が決めることではない)

古い互換性を保つコード・機能を忘れれば、Perl文字列はPerl文字列という物一つに統一されている。実にシンプル
逆にPerlの外ではいろんな文字コードが存在し変換の必要があるが、それはPerlのせいではない。

NKFやJcodeといったPerl文字列が存在しなかった時代に作られた「"バイナリ"を無理やり
文字列とみなして操作する」古いモジュールのことを忘れればこんなにシンプルなんだ。


長々と書いたが、結論はこれだけ。
Perl外部に存在する"バイナリ" と Perl内部に存在する"Perl文字列"
"バイナリ"を○○コードとみなして、"Perl文字列"に変換するのがEncodeモジュール
0506nobodyさん2011/08/26(金) 02:40:07.58ID:???
おまけ >>501の図の修正版

US-ASCII
Latin-1
UTF-8       いくつものエンコードがある
Shift-JIS     混沌とした世界
EUC-JP
その他

↑Perl外の世界の文字 (UTF-8フラグ 全部OFF)

----------------------Encodeモジュール等で変換

↓Perl内の世界の文字 (UTF-8フラグ ON)

Perl文字列 (ないしょだけど実装はUTF-8フラグ付きのUTF-8エンコード)

           たった一つのシンプルな世界


 Encodeモジュールで変換しなかった文字はどうなるかって?
 それは文字ではない。ただのバイナリ、バイトの配列だ。

0507nobodyさん2011/08/26(金) 17:45:56.27ID:???
”Perl文字列”の正式名称は、テキスト文字列(文字の文字列) Text strings (character strings)
公式ドキュメントでは、Unicode文字列という名称は削除されている。

perlunitut - perldoc.perl.org
http://perldoc.perl.org/perlunitut.html#Definitions

perlunitut - Perl における Unicode のチュートリアル 【perldoc.jp】
http://perldoc.jp/docs/perl/5.10.0/perlunitut.pod#Text32strings32character32strings41
0508nobodyさん2011/08/27(土) 20:42:35.80ID:???
丁寧なレス、乙。

内容にはあんまり同意できないけど、とりあえず全部バイナリ
で処理して、それで困ったら文字列で処理することにする。
(そしてあんまり困らなそうな予感がする)

"Perl文字列フラグ" が「このデータは文字列だ」ということを
表わしているときと表わしていないときとがありそうに思える
ので自分が理解するまでは手が出せない。

他の言語、例えばC言語やVBだとかにも文字列フラグってあるん
かな?多言語処理をするにあたって不可欠なものなのかな?
0509nobodyさん2011/08/28(日) 00:22:09.84ID:???
C言語には文字列はない。すべてがバイナリ。C++には文字列型がたくさんある。
VB6は文字列はString型に入れるものでバイナリはbyte型配列に入れるもの。
Javaにもstringがある。VB.NETはしらん。

変数に型がある言語では、文字列型に入れた時点で文字列として扱われる。
その時にフラグやらなんやらいろんな情報が追加されるだろうが、それは気にすることじゃない。
そういう意味でPerよりも厳格に文字列とそうでないものが型として区別されている。

> 多言語処理をするにあたって不可欠なものなのかな?
不可欠。なぜなら「一文字」を認識できないことには、文字列処理はできない。

どうしても文字型というものが必要。それが型あり言語では型そのものであり、
型なし言語では、変数に入っている物にフラグをつけるしかない。
変数にバイナリデータだけ入っていては、バイナリと文字の区別はつかないからね。
だから少なくともこの2つを区別するためのフラグは必要になる。
0510nobodyさん2011/08/29(月) 00:05:56.67ID:???
それは処理系の実装者にとって、という意味なら同意だけど、
アプリを書く利用者にとって、ということなら同意できないな。

古今東西、これまでのコンピュータ言語で文字列フラグが
必要だったことがない。Unicodeだから必要になったと主張する
のなら、何かを間違えていると直感する。
0511nobodyさん2011/08/29(月) 01:21:52.14ID:???
> これまでのコンピュータ言語で文字列フラグが
> 必要だったことがない。

それは他の言語に文字列フラグに相当するものがあっただけの話。
多くの静的型付け言語では、文字列型というものがあった。そしてその文字列型は○○コードと
決まっており、文字列型の○○コードと、外部から渡される文字コードが違えばそのコードに変換して扱う。
それが文字列フラグを付けることに相当するものだ。
文字列フラグを付けるのは、データの文字列型へのキャストとも言えるな。
フラグというものを意識しすぎ。文字列型がバイナリ型かこの2つを意識すればいい。

言語側で文字列型は○○コードと決まってない言語では、プログラマが、
今、変数に入っているのは、何コードかを意識しないといけない面倒な言語になってる。
そういう言語はたとえ文字型と名乗っていても実質1バイト固定のバイナリ型であり
ほんとうの意味での文字列型ではない。C言語がそう。そしてその一つが昔のPerl。

今は、Perlは簡単になった。それは文字列型というものができたため。
動的型付け言語では変数に型がないから、データの方に型情報をもたせるしか無い。
それは文字列として扱いたければ、バイナリから文字列に変換する関数が必要になるということ。

これまでのコンピュータ言語を含め、”プログラマが文字コードを意識したくないのであれば”、
言語側で標準文字コードを決め、それに変換する処理が必要になり、そして実際にあるんだよ。
Unicodeだから必要になったのではない。文字の扱いを簡単にする → 文字列型が必要 → 変換処理が必要。

今のPerlのように文字型は○○コードと決まっている言語では、文字列として扱うとき
Javaなども含めて読み込み時に○○コードに変換してるよ。

重要な所を繰り返すね。Javaと同様、今のPerlは文字コードが決まってるよ。だから変換が必要だよ。

> のなら、何かを間違えていると直感する。
お前のプログラマ直感能力の限界だよそれはw
0512nobodyさん2011/08/30(火) 22:43:53.56ID:???
それは個人の脳内のモデルゆえ、あまり賛同を得られない
0513nobodyさん2011/08/30(火) 22:50:23.11ID:???
>>512
うわw それはお前個人の感想だろ。
なんで賛同とか言っちゃってるの?w

周りはみんな賛同を得ている。だから反論はない。
お前一人が、わかってないだけw
0514nobodyさん2011/08/31(水) 03:06:54.06ID:???
横レス

こんな超絶過疎スレで
>周りはみんな賛同を得ている。だから反論はない。
は、ねーだろw

自分定義の用語が出た瞬間から、数少ない住人は、
生暖かい目で見てるだけだ。
0515nobodyさん2011/08/31(水) 22:12:11.60ID:???
過疎スレなのに見てるとかw

「見てるなら、反論はしてない」の間違いだろw
0516nobodyさん2011/09/04(日) 14:32:29.75ID:???
エンタープライズ環境だったら、ソースを長くメンテしなきゃ
ならないし、世間のはやり・廃りの影響を受けたくない気持は
分かる。

ついこの間まで、モダンPerlはutf8フラグといっていたものが
これからは文字列フラグの時代!utf8フラグはもう消した。
となってはついていけなくなってしまう。

日本はガラパゴスなので代々、ソースがつぎ足しつぎ足し
でいい味が出ている場合もあると思う。

結局、はやり・廃りを糧とするのか、組み上がってるシス
テムを大黒柱としているかの違いなんだと思う。

大黒柱組に流行を押し付けようとしてもうまくいかないと
思うんだ。
0517nobodyさん2011/09/04(日) 15:18:09.35ID:???
"文字列フラグ" 約 2,560 件 (0.15 秒)
"文字列フラグ" perl 約 114 件 (0.07 秒)
0518nobodyさん2011/09/04(日) 21:09:35.36ID:???
>>516
文字列フラグって、UTF8フラグが紛らわしいから
言い換えて説明したほうがわかりやすいってことで
このスレの中でとりあえずそう呼んでただけだろ。
一般的にはUTF8フラグだ。
0519nobodyさん2011/09/04(日) 21:33:51.14ID:???
勝手に言い換えるのが、混乱を招いた良い例だな
本人はそれで説明した気分になってるんだろうけど
0520nobodyさん2011/09/04(日) 21:35:13.73ID:???
>>519
例えを使った説明ってそんなもんだろ・・・
勝手にじゃなくて、ちゃんと断ってたし、
お前、何が気にくわないんだ?
■ このスレッドは過去ログ倉庫に格納されています