トップページ⇒php
1001コメント354KB

【Perl 】初心者コーナーPart8

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。01/10/24 14:11ID:???
いらっしゃーい、perlのコーディングで困ってる人のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。

参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://ebi.2ch.net/test/read.cgi/php/988809842/l50
CGIの質問はこちら【CGIだけど、なんか質問ある?part4】
http://ebi.2ch.net/test/read.cgi/php/1000804655/l50

過去ログ、その他の役立ち情報は>>2-10を見よう。
065557201/12/08 14:46ID:4/I3dmD1
>>617様
ありがとうございます。
全て解決しました。
結論は・・・私がバグっていたからです。
while($line =~ m/.[\b]) {$line =~ s/.[\b]//;}
を行う位置を誤っていて、
自分でバックスペースをスペースへ変換してから
件の処理を行う様になっておりました。

という訳で、今後も精進致します。
0656名無しさん@お腹いっぱい。01/12/08 21:49ID:???
%HASHの中身を直接いじる方法無いかな
foreach(%HASH{keys %HASH}){ $_をいじる }
だと何も変わらないので
foreach(keys %HASH){$HASH{$_}= … }
ってコピーしてやってるんだけど,普通の配列を
foreach(@ARRAY){ … }
とやるみたいに直接中身を書き換える方法は無いの?
0657名無しさん@お腹いっぱい。01/12/08 22:02ID:???
>656
keyわからなくなるけどforeach (values %hash)とか
0658名無しさん@お腹いっぱい。01/12/08 22:22ID:???
each 使えってば
0659ほらよ01/12/08 23:13ID:???
//www.ultraman.gr.jp/~momiyama/Learning_Perl/reference.htm

eachやvaluesはダメよ
0660名無しさん@お腹いっぱい。01/12/08 23:23ID:???
和気和歌蘭(^∀^)
0661名無しさん@お腹いっぱい。01/12/08 23:29ID:???
>656
>>foreach(%HASH{keys %HASH}){ $_をいじる }
何をやりたいのか分からないです :-)
>>foreach(keys %HASH){$HASH{$_}= … }
コピーしてるとは? 一時配列を作りたくないって事?

だったら for(($key,$value)=each %HASH){if($key eq 'hoge')$HASH{$key}='...';}
なら一組のリストしか出来ないけど
>659
なんでリファレンス?
0662これの事かい?01/12/08 23:37ID:???
>Note that you cannot modify the values of a hash this way, because
>the returned list is just a copy. You need to use a hash slice for
>that, since it's lvaluable in a way that values() is not.
>
> for (values %hash) { s/foo/bar/g } # FAILS!
> for (@hash{keys %hash}) { s/foo/bar/g } # ok
0663名無しさん@お腹いっぱい。01/12/09 02:52ID:CTSZ1Ad/
すいません、>659のURLの「■ 多重ハッシュ(ハッシュのハッシュ)」のところを
見たんですが、

name1, email1, title1, comment1, …
name2, email2, title2, comment2,
name3, email3, title3, comment3,
…

という感じで、一度に複数投稿できるようなスクリプトを作りたいんです。
(掲示板じゃないんですが、例として)
それで、同ページの「多重ハッシュを動的に作成。」ってあたりをどう
書いたらいいんでしょうか。

%hatugen = (
res1 => { name => "name1の値",
email=> "email1の値",
title => "title1の値",
comment => "comment1の値",
},
res2 => { name => "name2の値",
email=> "email2の値",
title => "title2の値",
comment => "comment2の値",
);

と全部書いてやるるしか自分には出来なくて…。
0664こんな感じかにゃお01/12/09 04:09ID:???
$i=1;
for (<DATA>){
for(split(/,/,$_)){
($key,$value)=split(/:/,$_);
${hash{$i}}{$key}=$value;
}
$i++;
}
for $num (keys %hash){
print "\%{\$hash{$num}} are ... \n";
while (($key,$value) = each %{$hash{$num}}){
print "$key ----> ${$hash{$num}}{$key} \n";
}
}
__DATA__
name:name1,mail:email1
name:name2,mail:email2
name:name3,mail:email3

未テスト
0665名無しさん@お腹いっぱい。01/12/09 04:09ID:pYGvWQvh
上のカンマ区切りのやつはフォームから入力するんかい?それともファイル?
それによって違うんだけど・・・
あとね、この場合普通はハッシュのハッシュは使わない。
配列の配列の方が無難。つまり、
@hatsugen = (
[ "name1", "email1", "title1", "comment1" ],
[ "name2", "email2", "title2", "comment2" ],
. . .
)
って感じ。理由はメモリの節約。
で、
use constant NAME => 0;
use constant EMAIL => 1;
use constant TITLE => 2;
use constant COMMENT => 3;
ってやっておけば、
$hatsugen[0][EMAIL]で最初の発言のメールを取得できるでしょ。
enum モジュール使えばなお可。
http://search.cpan.org/search?dist=enum

#enum標準にしてくれないかな・・・
0666こんな感じかにゃお01/12/09 04:10ID:???
あ、ちょっと違うか、まぁ適当に直してくり
0667名無しさん@お腹いっぱい。01/12/09 04:52ID:???
>663です。回答ありがとうございます。

>665
>上のカンマ区切りのやつはフォームから入力するんかい?それともファイル?
フォームです。

>664 >665さんの回答を自分で試してみてから、
またレスします。 (適当に直せる自信ないけど…)
0668こんな感じかにゃお01/12/09 05:12ID:???
えっと、一応補足すると>665氏の言う通り多重ハッシュは効率悪いよ
つか俺も知らなかったけどListofListで列挙型使えるのイイ(・∀・)ね
あとシンボリックリンク恐怖症じゃなければ、単純に枝番ふった連装配列
ってのも有りかな・・・
0669名無しさん@Emacs01/12/09 11:56ID:???
Perl で、
ある画像(GIF,JPEG,PNG 等)の
幅と高さを取得できるようなスクリプツはできますか ?
0670名無しさん@お腹いっぱい。01/12/09 12:31ID:???
>>669
Image::Size
まだ、使ったことないけど、たしかこれで。
0671名無しさん@Emacs01/12/09 13:08ID:???
>>669
サンクスコ!!
0672名無しさん@お腹いっぱい。01/12/09 18:43ID:???
おまえに教えて損した
0673名無しさん@お腹いっぱい。01/12/09 19:43ID:???
名無しさん@Emacsって何処かの板の名無しさんですか?(スレッド違いすまん)
067467001/12/09 19:55ID:???
670 != 672
0675名無しさん@お腹いっぱい。01/12/10 15:59ID:???
根拠はあるのか?
0676名無しさん@お腹いっぱい。01/12/10 22:00ID:???
「もし条件Aならば処理Aをしなさい、あるいはもし条件Bならば処理Bをしなさい」を
if(条件A){処理A;}
elsif(条件B){処理B;}
と書く場合、

「もし条件Aでなければ処理Aをしなさい、あるいはもし条件Bでなければ処理Bをしなさい」は
unless(条件A){処理A;}
elsif(条件B){処理B;}
でよいのでしょうか?

現在、elsifを使うべきかわからない状態です
0677名無しさん@お腹いっぱい。01/12/10 22:05ID:???
>unless(条件A){処理A;}
>elsif(条件B){処理B;}
これ出来たっけ?(未確認)
否定文並べるか肯定文ならべるかはケース倍ケースdeath
if(条件A){処理A;}
elsif(条件B){処理B;}
は
if(条件A){処理A;}
if(!条件A 且つ 条件B){処理B;}
の略、省略したいから使うだけで悩む事じゃないでふ〜〜
0678名無しさん@お腹いっぱい。01/12/10 22:20ID:???
>676
試してみたら一発じゃん・・・。
俺は出来た。
0679名無しさん@お腹いっぱい。01/12/11 01:30ID:???
俺はif(!〜の方が可読性いいと思うな
0680名無しさん@お腹いっぱい。01/12/11 01:58ID:???
>>現在、elsifを使うべきかわからない状態です
elseの意味を調べてくれ
0681名無しさん@お腹いっぱい01/12/11 14:09ID:???
社内で使うアンケート集計フォームを作りました。
記入された内容をCSVファイルに追加書き込みしているのですが、
複数行入力を許しているテキストフィールドの内容を書き込む際、
改行コードが邪魔になってしまいます。

書き込む際に改行コードを強制削除したいのですが、
うまく消えてくれません。
$other=~ s/\n/<br>/g;
と他の文字列に置換してみたところ、
改行タグの後ろに結局改行コードが残ってしまいました。
($otherには入力内容が入ってます。)

サーバはNTで、perlのバージョンは5です。
何か良い方法はないでしょうか?
0682生厨房01/12/11 14:44ID:???
>>681
$other =~ s/\r?\n/<br>/g;

その処理の前に & < > も変換しとかないとね
0683名無しさん@お腹いっぱい01/12/11 15:08ID:???
>>682

ありがとう。
きれいなデータになりました。
ちなみに
\r?
にはどういう意味があるのですか?
0684生厨房01/12/11 15:17ID:???
>>683
Windows,Unix,Macの改行コードの違いを調べるといいよ
あとエスケープシーケンスも
0685名無しさん@お腹いっぱい01/12/11 15:27ID:???
>>684

了解しました。
世の中のPerlの本はUNIX前提になっているものが多いんですね。
次はLINUX+PHP+Postgresqlを勉強する予定なので、
またまた文字コードに悩まされそう。
0686名無しさん@お腹いっぱい。01/12/11 15:45ID:???
CGIってNULLってあるの?
それと文字数を数えるのってどうやるの?
aだと1、aaaだと3を返すやりかた。
0687名無しさん@お腹いっぱい。01/12/11 16:01ID:???
>686
http://pc.2ch.net/test/read.cgi/php/1000804655/854-855
奇遇だな。
ちょうど同じような質問を見かけたところだ。
0688名無しさん@お腹いっぱい。01/12/11 16:34ID:???
ちゃうよ。
abcでも3を返したいの。そこのリンクは1が帰ってくるでしょ。
0689名無しさん@お腹いっぱい。01/12/11 16:41ID:???
length()
069068801/12/11 17:03ID:???
それそれ。ども、ども。
0691名無しさん@お腹いっぱい。01/12/11 17:20ID:P2qcRNJ8
print <<"HTML";
<script language="javascript">
<!--
function javascript { 〜 }
// --> </script>
<form name="form1" onsubmit="return javascript()" action="">
<input type="text" name="abc"><input type="submit" name="button1" value="CHECK!">
</form><form name="form2" action="$scriptname">
<input type="submit" name="button2" value="XXXXX">
</form>
HTML
わけあってこうしなければならなくなった。
ようするに、form1で、入力された文字列を、javascriptで処理し、その処理結果を、perlで処理したい、という事。
もしかすると、HTML以前の問題かも。

心の広い方、教えてください。
0692名無しさん@お腹いっぱい。01/12/11 17:22ID:???
>691
マルチポストウザイ。
0693名無しさん@お腹いっぱい。01/12/11 17:26ID:P2qcRNJ8
ごめんなさい…
0694名無しさん@お腹いっぱい。01/12/11 19:28ID:???
>692
放置するか回答するの二者択一でお願いしまちゅ
0695名無しさん@お腹いっぱい。01/12/11 19:28ID:???
(放置|回答)
0696名無しさん@お腹いっぱい。01/12/11 23:31ID:???
放置か回答か?
マルチ野郎の思う壺じゃないか。
0697名無しさん@お腹いっぱい。01/12/12 00:04ID:1mlMOGo3
IPアドレスからホスト名への変換処理をしようとしています。

$addr = $ENV{"REMOTE_ADDR"};
$host = gethostbyaddr (pack ("C4", split (/\./, $addr)), 2);

この処理で、gethostbyaddr以下が良く分かりません。
$addrに格納されたIPアドレスの『.』を取り去った四つの数字をバイナリ化(?)
したものを・・・?
最後の2が何を表すのか、また他に使える数字にはどんな
ものがあるのか知りたいです。

それとgethostbyaddr関数ってpackとペアに使わなくちゃいけないものなんですか?
0698名無しさん@お腹いっぱい。01/12/12 00:33ID:???
Perlのgethostbyaddrは対応するシステムコールをするだけ
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/gethostbyaddr.3.html
>最後の2が何を表すのか、また他に使える数字にはどんな
定数AF_INETを指します、他に使えるすうじは有りません
>packとペア
勿論、自分でオクテット毎に255^n*xしてもらっても結構です
0699JAPU@ハーマイオニー萌え ◆JAPUTeX. 01/12/12 01:47ID:???
>>697

use Socket;
$x = gethostbyaddr(inet_aton("61.194.226.203"), AF_INET);

が吉。(inet_aton 使わないで、自分でpackしてもよいけど。)

AF_INET は環境によって異なる定数なので、数字で与えるのは移植性を低下さ
せます。(多分) 何でこんな面倒なことをしているかというと、ソケットって
のはIPv4に限らず、様々なプロトコルを使えるように出来ているからなんです。
アドレスファミリとしては、これ以外にも AF_INET6 などがあります。(環境
によっては無いけど。)

use Socket;
use Socket6;
$x = gethostbyaddr(inet_pton(AF_INET6, "3ffe:501:4819:2000:280:adff:fe71:81fc"), AF_INET6);
print "$x\n";

=> apple.kame.net と表示される。

# Socket6 は標準モジュールではありません。
0700名無しさん@お腹いっぱい。01/12/12 16:10ID:Mrx6ZMte
>>698
>>699
ここで質問しておきながら自分でも色々なサイトを捜してみて、なんとなくうす
ぼんやりと分かってきました。
あとは自分で色々試すだけ。

ありがとうございました。
0701名無しさん@お腹いっぱい。01/12/12 18:31ID:BvKUxJBs
libwww-perl-5.6.1のインストールについて質問

URI,MIME-Base64,HTML-Parser,libnet,MD5をインストールし,
make testでokが出たのですが,libwww-perlのmake testで
エラーが出ます../TEST -vすると以下の通り
, ./TEST -v live/validator.t
live/validator......No such field 'uploaded_file' at live/validator.t line 31
1..2
dubious

live/validator.tを見ると,
my $uri = "http://validator.w3.org/file-upload.html";
のフォームに書き込んでチェックをしている? みたいなんですが,
w3cの同ページが変更されて,みんなエラーが出ているんでしょうか?
0702名無しさん@お腹いっぱい。01/12/12 20:46ID:KPDzNand
*.htmをぜんぶ*.htmlに変えたのですが、a href=の指定がhtmの
ままになっちゃってます
フィルタプログラムではなく、ファイルを直接書き換えたいのですが
どうしたら良いのでしょう???
0703名無しさん@お腹いっぱい。01/12/12 21:06ID:???
>>702 ヘルプ見れ
0704JAPU@ハーマイオニー萌え ◆JAPUTeX. 01/12/13 01:12ID:???
>>701

うちは All tests successful. だけどなぁ。
libwww-perl-5.62 + Perl 5.005_03 on FreeBSD

>>702
perl -i -npe 's/href="(.+?\.htm)"/href="$1l"/g' *.html

とか? 文章中に href="puni.html" とかあったらそれまで置換しちゃうけど、
その辺は手作業で何とかして下さい。-i.bak とすれば .bak の拡張子がつい
たバックアップファイルがつくられます。
0705名無しさん01/12/13 02:14ID:???
term上でstdoutに出力した文字列を削除したい場合どうするんでしょうか?
なんかTerm::CapのTputs('dl'...)でやるみたいなんですが、どうやっても
うまくいきません。

print 'aiueo.'
と出力して、出力されたaiueoを削除する方法を誰か御存じないでしょうか。
0706JAPU@ハーマイオニー萌え ◆JAPUTeX. 01/12/13 03:02ID:???
どういう環境で、どう上手く行かないのか書かれていないので何とも言えない
けど、単に文字が消えるだけでカーソルがそのままなので困っているのなら

print $terminal->Tputs("dl", 1, undef);
print $terminal->Tputs("cr", 1, undef);

という感じ?

man termcap:

delete_line dl delete line (P*)
carriage_return cr carriage return (P*)
0707名無しさん@お腹いっぱい。01/12/14 17:56ID:eZS0n+wo
perlって変数使うとき
0とかでわざわざ初期化してますか?
それともいきなり値代入しちゃいますか?
0708Kusakabe Youichi01/12/14 18:01ID:???
>>707
In article <[email protected]>, 名無しさん@お腹いっぱい。/707 wrote:

> perlって変数使うとき
> 0とかでわざわざ初期化してますか?
> それともいきなり値代入しちゃいますか?

i = 0;
i = 135;
って書いた方がいきなり入れるより綺麗にはいりますね (うそ)。
0709名無しさん@お腹いっぱい。01/12/14 20:01ID:UVoMYWWJ
%aa = ('a11'=>'aa');
$bb=10;

print $aa{"a($bb+1)"};

こんな感じでハッシュを参照させたいんですけど
表示されません。
うまい方法無いでしょうか?
0710名無しさん@お腹いっぱい。01/12/14 20:19ID:???
意味が分からない、aって何なの?
0711名無しさん@お腹いっぱい。01/12/14 20:23ID:???
ああ、そりゃ無理だ、
$foo = $bb+1;
$baz = "a".$foo;
$aa{$baz} で良いじゃん
0712名無しさん@お腹いっぱい。01/12/14 20:24ID:???
>709
%aa = ('a11'=>'aa');
$bb=10;

print $aa{"a".($bb+1)};

これでどうかな?
0713名無しさん@お腹いっぱい。01/12/14 20:27ID:???
こう言うの見てると、型無し言語逝ってよしに
賛成せざるを得ないね
0714  01/12/14 20:43ID:???
>>713 訳分からなくなるよな
俺はなるべく、$hoge+=0; を書くようにしてる
0715名無しさん@お腹いっぱい。01/12/14 20:55ID:???
Perl初心者のくせにCを勉強しはじめましたが、ややこしくて死にそうです。
0716名無しさんに接続中…01/12/14 20:59ID:lmAPrLZ5
CGI(perl)で、他のプログラムを呼び出したり操ったりすることはできますか?
また、シリアルポートなどに信号を出力することはできるんですか?
0717ウンコー01/12/14 20:59ID:Uhp3YWba
初心者用参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://www.puchiwara.com/hacking/
0718デフォルトの名無しさん01/12/14 21:01ID:???
>>713
型無しだから悪いんじゃないよ、これはこれで便利だし
「Perlに問題は無い、Perlが生み出すプログラマが問題なのだ」って感じ ヽ(´ー`)ノ
0719名無しさん@お腹いっぱい。 01/12/14 21:03ID:???
>CGI(perl)で、他のプログラムを呼び出したり操ったりすることはできますか?
出来ます
>また、シリアルポートなどに信号を出力することはできるんですか?
出来ます
0720名無しさんに接続中…01/12/14 21:21ID:lmAPrLZ5
>>719
よかったら、そのやりかたのヒントを教えてください。
教えて君でスマソ
0721デフォルトの名無しさん01/12/14 21:51ID:euO3A1/1
>720
他のプログラムはexecと("hoge")かsystem("hoge")とか`hoge`とか
シリアル通信は、WINならopen(COM,">COM1"); Unixならopen(COM,"/dev/tty0");とか
俺はNewtonlink使ってたけど、
と言うか、処理系も書かずに何が知りたいのかと問い詰めたい
0722名無しさん@お腹いっぱい。01/12/14 21:55ID:???
>>715

> Perl初心者のくせにCを勉強しはじめましたが、ややこしくて死にそうです。

Perlの方がよほどややこしいと思うが。
無秩序に仕様を拡大してしまったからね。
0723名無しさん@お腹いっぱい。01/12/14 21:59ID:wyNE/AKi
>712
それでできました。即レス感謝です!
>711
なんか公開されてるスクリプトみると1行にまとめてあったりして
なんかうまく見えるのでそれを見習おうかと思いまして。。
0724デフォルトの名無しさん01/12/14 22:32ID:???
>722
その割にswicthとかtryANDcatch構文は拒んでるんだよなあ・・・
どうせなら全部突っ込んじゃえばいいのに(笑
0725名無しさん@お腹いっぱい。01/12/14 23:48ID:???
>>724
switch
http://search.cpan.org/search?dist=Switch
Perl 5.7.2から標準。

例外処理
http://search.cpan.org/search?dist=Exception
perlsub の prototypeあたりにも。
0726名無しさんに接続中…01/12/15 00:22ID:q1op3191
>>721
ひとまずはWindows用のPerl処理系でやってみて
できたらLinuxでもやってみたいです。
ありがとうです!
0727名無しさん@お腹いっぱい。01/12/15 00:24ID:???
>>725
おお〜、ラリーも遂に押し切られたって訳か(^-^;
Perl4時代から要望あったんだよね>switch
しかし cpan重いなあ、、、
0728名無しさん@お腹いっぱい。01/12/15 00:30ID:???
と思ったらモジュールなのか、
自分はそんなに使わないけど >switch文
0729名無しさん@お腹いっぱい。01/12/16 23:29ID:RrZ9jdoL
パスワードの暗号化で分からないことがあるので質問します。

以下のスクリプトは暗号化処理のサブルーチンです。
$saltに入るのはランダムに選出された文字/数字二桁ということは分かりました。
しかしなぜint関数が必要なのかよく分かりません。
あと配列のブラケットには数字だけしか入れられないと解釈しているのですが、
$salt = $SALT[int(rand(@SALT))] . $SALT[int(rand(@SALT))];
この処理だとブラケット内にはローマ字も入ってしまうのではないかと・・・。
違いますかね?

宜しくお願いします。


sub encrypt {
local($inpw) = $_[0];
local(@SALT, $salt, $encrypt);

@SALT = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/');
srand;
$salt = $SALT[int(rand(@SALT))] . $SALT[int(rand(@SALT))];
$encrypt = crypt($inpw, $salt) || crypt ($inpw, '$1$' . $salt);
return $encrypt;
}
0730名無しさん@お腹いっぱい。 01/12/16 23:53ID:???
もうちょっとまともな本を読もう。
ローマ字って何処にあるんだろ??
0731名無しさん@お腹いっぱい。01/12/17 00:02ID:FsLSfXJ8
>>730
すみません。
本はないんです。

@SALT = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/');
の処理で@SALTには小文字/大文字、0から9までの数字、『.』、『/』が入ります
よね?で、rand(@SALT)にすると小文字/大文字まで入ってしまう可能性があり、

$salt = $SALT[int(rand(@SALT))] . $SALT[int(rand(@SALT))];
の処理で

$SALT[a]などでは具合が悪いんではないかと・・・。
で、int関数はそれを適当な数字に変えてくれるものなのかなぁと思ったのでした。

ちょっと混乱気味。
0732名無しさん@お腹いっぱい。01/12/17 00:03ID:1/pypqLH
>>729
まず、
rand(@SALT)
ですけど
rand(64)
ってことです。
rand('a'..'z', 'A'..'Z', '0'..'9', '.', '/')
ではありませんよ。
この場合は要素の数、64を返します。
それで、rand(64)は0から64までの数をランダムに返します。
必ず整数を返すなら良いのですが、小数も含めて返しますので
int()関数で整数にしてやるんです。
0733名無しさん@お腹いっぱい。01/12/17 00:11ID:???
>729
$salt_all = @SALT;
$salt = $SALT[int(rand($salt_all))] . $SALT[int(rand($salt_all))];
と考えるとわかりやすいと思う。

>732
一応補足的ツッコミだけど、
>それで、rand(64)は0から64までの数をランダムに返します。
64は出ないんじゃなかったっけ?
言いたい事はわかるんだけど伝わりにくいかなと。
0 <= rand(64) < 64
ってことだよね?
だから、
0 <= int(rand(64)) <= 63
って事で。
0734名無しさん@お腹いっぱい。01/12/17 00:39ID:???
>>732
>>733
ありがとうございます。

一気に氷解しました!

>>733
>> $salt_all = @SALT;
>> $salt = $SALT[int(rand($salt_all))] . $SALT[int(rand($salt_all))];

この式、>>732と併せて読むとすごくよく分かります。

ありがとうございました。
0735名無しさん@お腹いっぱい。01/12/17 06:36ID:BJnjirbB
OO童貞ですがPerlから始めようと思います。
PerlOOに特化した為になる書籍やサイトは有りますか?(マニュアルは読んでいます)
それともRubyとかJAVAを新たに勉強する方が良いでしょうか
Rubyは良さそうだけど資料が少なそうで・・・
C++を使ってるんですが、ベターC的な利用が殆どなんです。
それで、巨大なC++の前にperlで学習しようと言う目論みです ^^
0736名無しさん@お腹いっぱい。01/12/17 07:07ID:???
OOの勉強にPerlが適当かどうかはかなり疑問だけど、
perldoc perlboot から始めて、perltoot、perlobj で勉強。
モジュールもわからないとダメなので perlmod も。

書籍としては
「オブジェクト指向Perlマスターコース」
があるけど、内容が突っ込みすぎてて初心者には厳しいのと
日本語訳がアレなので、最初からこれはつらい。
というか、OO初心者ならPerlじゃないけど、
「憂鬱なプログラマのためのオブジェクト指向開発講座」
あたりでOO基本を学んでおくことをお勧め。
「Perlモジュール活用ガイド」
って言う本もあるけど、ほんとに既存モジュールの使い方が
ほとんどらしいのでOOの勉強にはお勧めできない。

参考になりました?

# perlboot日本語訳
# http://perl.infoware.ne.jp/documents/perlboot.ja.html
# オブジェクト指向Perlマスターコース
# http://www.amazon.co.jp/exec/obidos/ASIN/4894713004
# 憂鬱な〜
# http://www.amazon.co.jp/exec/obidos/ASIN/4881356194
073773501/12/17 07:44ID:BJnjirbB
有難う御座います>>736さん
参考になります。
なるほど、憂鬱な〜〜は一度立ち読みして「ふーん」と思ってたんですが。
手続き型が染み付いてしまって(実はオヤジなのです・・)
良くperlのOOは不完全?と言われていますが、自分には使い慣れた言語なので
入門には良いかなと思いまして。。
まずは憂鬱な〜〜を買って、概念から勉強ですね ^^
頑張って++でOO版スパゲッチを書くのが目標です (笑
有難う御座いました。
0738735 01/12/17 08:44ID:???
use objectって良いですね  ^^
全然知らなかったよ。
0739名無しさん@お腹いっぱい。01/12/17 14:53ID:eOxPZi/I
%xxx = ('a','あ','i','い');
というのを
aiueo.txtというファイルのなかに
'a','あ','i','い'と入力し
%xxx = (ここをaoueo.txtから出す);
という事は可能なのでしょうか?
0740名無しさん@お腹いっぱい。01/12/17 15:08ID:???
eval
0741名無しさん@お腹いっぱい。01/12/17 15:36ID:???
gzipのやり方を教えて下さい
タグの何処にいれてやればいいの?
0742名無しさん@お腹いっぱい。01/12/17 15:37ID:???
>741
http://www.linux.or.jp/JM/html/GNU_gzip/man1/gzip.1.html
0743名無しさん@お腹いっぱい。01/12/17 15:45ID:???
>739
そう言うのはあまり感心しない、
tie使えばDBにそのまま保存できるぞ
>740
何言ってるのか和歌蘭、5.7の新しい関数か?
0744名無しさん@お腹いっぱい。 01/12/17 17:21ID:???
冬休みに勉強たあ見上げたもんだけど
>>2〜に乗ってるリンクで関数位検索しろよ
0745名無しさん@お腹いっぱい。01/12/17 22:54ID:HHw/58GZ
linuxのpasswdコマンドを実行するPerlプログラムを作りたいんだけど、
passwd って対話式でパスワードを二回入力しないとダメでしょ。

  system "/usr/bin/passwd $username";

この後にどうやればパスワードを渡せるのでしょうか?
0746_gunzip@眠い01/12/18 00:50ID:???
>>745
その手の処理は/usr/bin/expectの仕事かなぁ。
Perlでやるなら、
(/usr/bin/passwdコマンドのメッセージの細かい相違は自分で修正してくれ)

#!/usr/bin/perl

use strict;
use Expect;
use constant true => 1 == 1;
use constant false => !true;
use constant passwd => "/usr/bin/passwd";
use constant timeout => 10;

change_password("account", "old_password", "new_password");

sub change_password
{
    my($account, $current, $new) = @_;
    my $ret = true;
    my $pty = new Expect(passwd, $account) or return false;

    $pty->expect(timeout,
        [ eof => sub { $ret = false } ],
         [ timeout => sub { $ret = false } ],
         [ qr/Only root can specify/i, sub { $ret = false }],
         [ qr/changing/i, sub { exp_continue; } ],
         [ qr/new/i, sub { shift->send("$new\r"); exp_continue; } ],
         [ qr/retype/i, sub { shift->send("$new\r"); } ],
         [ qr/current/i, sub { shift->send("$current\r"); exp_continue; } ],
     );
     $pty->soft_close();

     return $ret;
}
0747名無しさん@お腹いっぱい。01/12/18 01:10ID:rl0gNi9C
コマンドラインから標準入力を一行読み込んで処理、また一行読み込んで処理を
繰り返して、対話的に処理を進めるプログラムを作りたいのですが、皆さんなら
どのようにコードを書きますか?

私はこんな感じにしたのですが、こうやれゴルァみたいなのをお願いします。

until (\n != <>) {
  print();
  //何か処理する。
}

until (\n != <>) {
  print();
  //何か処理する。

}
0748しぽなし〜01/12/18 07:16ID:???
そゆ時はループするのが吉かも。。
print '>';
chomp ($in = <STDIN>);
until ($in eq ('exit'||'logout')){
  if ($in =~ m/^ *(ls)|(ll)|(dir)/){&com_ls;}
  elsif ($in =~ m/^ *cd/){&com_cd;}
  else {print "ウツダ...(-_- )\n";}
  print '>';
  chomp ($in = <STDIN>);
}
sub com_ls
{
  print "Listコマンドにゃん\n";
}
sub com_cd
{
  print "Cwdコマンドだわん\n";
}
0749名無しさん@お腹いっぱい。01/12/18 11:13ID:???
FAQっぽいんだけど、答え見つからなかったから質問。。

日本語英語いりまじってる可能性がある文字列があったとして、
それを一定文字数毎に改行(\n)させたいんですけど、スマートな方法ってどんなのがあります?
0750名無しさん@お腹いっぱい。01/12/18 12:01ID:???
スマートの定義は?
0751JAPU@ハーマイオニー萌え ◆JAPUTeX. 01/12/18 12:49ID:???
EUC-JP 限定。

1... 一定バイト数ごと、つまり、
ASCII = 1文字
JIS X 0208 = 2文字
JIS X 0201 Katakana = 2文字
JIS X 0212 = 3文字
という扱いで、複数バイト文字にかからないように改行をつけたい場合。

s/(.{1,$len})(?=(?:[\x00-\x7f\x8e\x8f] |
(?:(?:[\xa1-\xfe]{2})*([\x00-\x7f\x8e\x8f]|\z))))/$1\n/gx;

2... ASCII でも X0208 でも1文字として扱う場合は
s{((?:[\x00-\x7f] | # ASCII
\x8e[\xa0-\xdf] | # JIS X 0201 Katakana
\x8f[\xa1-\xfe]{2} | # JIS X 0212
[\xa1-\xfe]{2}){$len}) # JIS X 0208
}{$1\n}gxo;

スマートかどうかは分かりませんが。

$len にバイト数入れてください。
高速化するためには o modifier つけるか、直接数字入れること。
なお、perl 5.005 以降限定です。(多分) 5.004 ってそろそろ捨ててもいいよね?

# Shift_JIS は知りません。:-p
075274901/12/18 13:51ID:???
出来ましたありがとうございました〜

スマートは、別にどうとって貰ってもよかったんですけど、
場合正規表現で一発で・・・ってのを期待していました。
0753ウンコー01/12/18 13:52ID:vbilp2l6
ここにあるHTMLプログラム使えば、かなりキケンなことできるよ
http://www.puchiwara.com/hacking/
0754名無しさん@お腹いっぱい。01/12/18 14:08ID:PeGpklQN
perlとはあまり関係ないのですが、
SMTPサーバーがメールを受信した時に、perlのスクリプトを起動できると聞きました。
方法を教えてください。
関連するページでもかまいません。
0755JAPU@ハーマイオニー萌え ◆JAPUTeX. 01/12/18 14:37ID:???
http://www.jp.freebsd.org/man-jp/search.html で
aliases
forward
sendmail
を検索。
# postfix の場合は sendmail と同じ、qmail は微妙に違う。
■ このスレッドは過去ログ倉庫に格納されています