トップページ⇒tech
994コメント314KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん05/01/17 18:11:32
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。

CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc5.2ch.net/php/ )

CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。

http://www.perl.org/get.html
● 2005/01/17現在の最新版: 5.8.6
● 2005/01/17現在の開発版: 5.9.1
0232デフォルトの名無しさん05/01/31 02:47:18
>>227
お前の腕次第だ。馬鹿。
asp使ってもお前にはすごいWebアプリが作れるとは思えない。
0233デフォルトの名無しさん05/01/31 02:53:09
Perl PHP ASP、どれも一定の機能を備えてるから、
ウェブ開発で不可能なことは無いしね。作る人次第だ
0234Hiro5805/01/31 02:58:55
>>230
visualC#でもやってみようかと。。どちらにしろ、そこまで大きな依頼は
無いのでやはり必要ないかもしれないですね(スイマセン)今のところHPの管理ページ
のみなので。(ショッピングカートや在庫管理など)

>>231
Webアプリケーションフレームワークありました。とりあえず「Sledge」を見つけたのですが、スクリーンショット
など無くて、どのようなもんか想像できないです(泣)
0235デフォルトの名無しさん05/01/31 03:03:34
Jakarta でも眺めて何でもできる気分にでもなってくれ。
0236デフォルトの名無しさん05/01/31 04:02:05
>>226
WINのActivePerlなら、下のコードで こんにちは と
確かに表示できるので、use encoding "cp932"; とSJIS指定してる
ところで、EUCでも指定すれば、出来ると思うけどなぁ。
(ActivePerlでは、cp932と指定しないと化ける)

use Tk;
use encoding "cp932";
$mw = MainWindow -> new;
$lb = $mw -> Label(-text => "こんにちは!", -font => 'System') -> pack();
MainLoop;
0237デフォルトの名無しさん05/01/31 15:41:33
>>Hiro58

 Cやshでも使ってやれよ。
0238デフォルトの名無しさん05/01/31 15:41:38
>>234
>のみなので。(ショッピングカートや在庫管理など)

B2C?
SSL とか 負荷分散とか FW までヤラサレル悪寒 (((( ;´ω`))) カクカクプルプル
0239デフォルトの名無しさん05/01/31 21:18:27
$aが abcdefghiの値のいずれかの場合というifをつくるとき
if($a==/[abcdefghi]/){〜〜〜}
でいいのでしょうか?
0240デフォルトの名無しさん05/01/31 21:23:29
eq
0241デフォルトの名無しさん05/01/31 21:23:53
>>239
やりたいのはこういうことかな
if($a !~ /[^abcdefghi]/){〜〜〜}
0242デフォルトの名無しさん05/01/31 21:25:09
こうでは?
if ($a =~ /\A[abcdefghi]\z/) { 〜〜〜 }
024324105/01/31 21:29:42
なるほど最初と最後の一文字でやるんですね
=~でしたね

すみませんでした。
0244デフォルトの名無しさん05/01/31 21:35:54
ひねくれてみた。
if ($a =~ tr/abcdefghi// == 1) {〜〜〜}
0245デフォルトの名無しさん05/01/31 21:38:12
>>239
if (-1 < index('abcdefghi', $a)) {
;
}
0246デフォルトの名無しさん05/01/31 21:40:15
>>242
\Z のZは、小文字でも良いんだっけか?
if ( $a =~ /\A[a-i]\Z/ ) { 〜〜〜 }
0247デフォルトの名無しさん05/01/31 21:54:30
>>246
違うものだよ。

\Z Match only at end of string, or before newline at the end
\z Match only at end of string
0248デフォルトの名無しさん05/01/31 22:18:24
>>247
大文字Zだと$aの中身が "a\n" でもマッチしちゃうのね。
納得。お勉強になった。つか、ずっと勘違いしてた。
ご指摘、サンクスです。
0249デフォルトの名無しさん05/01/31 22:20:58
>>246
と書く前にさっとマニュアルを見るという行動が
なぜ出来ないのかと。
0250デフォルトの名無しさん05/01/31 22:30:12
>>249
\z って、最近実装されたんでね?
0251デフォルトの名無しさん05/01/31 23:22:45
>>236
御親切に御回答いただき有難うございます。
残念ながら御指摘の点を以下のように変更し実施しましたが、
文字化けの現象を回避するには至りませんでした。
暇を見付けて、もう少し検証を続けてみようと思っております。
有難うございました。

use encoding "euc-jp";
0252デフォルトの名無しさん05/01/31 23:25:32
>>250
> \z って、最近実装されたんでね?

それで?
いや、だから、

% perldoc perlre

に相当するアクションを行なわないのはなぜかと。
どういう問題があるの?

Winだと、添付マニュアルは、htmlで提供されてい
たりするんだっけ。
0253デフォルトの名無しさん05/01/31 23:32:00
>>245
それ間違ってねえ?
0254デフォルトの名無しさん05/02/01 01:03:18
配列の要素数を知りたいとき,

$num = @array;

でわかりますよね。
では,配列の配列(リストのリスト) の要素数を知りたい場合はどうすればいいでしょう?

たとえば,
1年1組は生徒数30人
2年1組は生徒数32人
3年1組は生徒数31人
という学校を,
@array[学校のクラス][各クラスにいる生徒の数]
という配列に当てはめたとき,

$num = @array;

とすると「$num = 3」(クラス数)になります。
そうではなくて,
num[1] = 30(1年1組)
num[2] = 32(2年1組)
num[3] = 31(3年1組)

という感じで各クラスの数を知りたい場合にはどうすればいいでしょうか?
0255デフォルトの名無しさん05/02/01 01:04:35
(誤)
という感じで各クラスの数を知りたい場合にはどうすればいいでしょうか?

(正)
という感じで各クラスの生徒数を知りたい場合にはどうすればいいでしょうか?


です。
すみません。
0256デフォルトの名無しさん05/02/01 01:04:52
perlで、Lan内へarpの問い合わせが出来るようなライブラリはありませんで
しょうか?
0257デフォルトの名無しさん05/02/01 01:09:32
>>256
質問する前にsearch.cpan.orgで調べようと思わんのか?あーん?
0258デフォルトの名無しさん05/02/01 01:11:05
>>254
まず、その配列の配列の実装方法わかってる?
(@arr1, @arr2)じゃ駄目、リファレンスを使う。
リファレンスについて調べれば自ずと方法がわかるはずだ。
0259デフォルトの名無しさん05/02/01 01:11:20
>>254
なにがしたいのかよくわからんが
$array[1] = 30;
ではいかんのか。
0260デフォルトの名無しさん05/02/01 01:11:46
>>254
$num[1] = @{$array[1]};
0261デフォルトの名無しさん05/02/01 01:19:53
ところで、「リファレンス」って言葉ググるのすごく大変だよね・・・
0262デフォルトの名無しさん05/02/01 02:28:00
>>258
頭悪いね

>>259
超頭悪いね
0263デフォルトの名無しさん05/02/01 02:38:12
>>254
超絶的に頭悪いね。
0264デフォルトの名無しさん05/02/01 08:25:01
>>254
# @array[学校のクラス][各クラスにいる生徒の数]
#   では、あやしいので、
# @array[学年][クラス] [生徒]= 各生徒のデータ
#   のとき
# (1年2組)
my $num = @{ $array[1][2] };
0265デフォルトの名無しさん05/02/01 11:45:43
$ans = hoge($s_time, $e_time, $abc1_num, \@moge1e_time) ;

↑これってどういう意味…?
特に最後の『\@』の意味がわからん…。
誰か教えてくれ〜。
0266デフォルトの名無しさん05/02/01 11:47:37
>>265
参照渡し
0267デフォルトの名無しさん05/02/01 12:04:14
>>261
「デリファレンス」でググるとピンポイントですごい命中
0268デフォルトの名無しさん05/02/01 13:05:37
>>267
ホントだ。「デリファレンス」って Perl 以外では使われない用語?
0269デフォルトの名無しさん05/02/01 14:52:03
>>268
むしろ日本(ry
0270デフォルトの名無しさん05/02/01 14:52:21
$hoge = '(foo|bar)([baz]+)';
$fuga = '$2,$1,moge';
# ...
$piyo =~ s/$hoge/$fuga/;

こんな感じに動的に$fugaの中の$1,$2を評価したいのですが、
どんな方法を使えばいいでしょうか。
0271デフォルトの名無しさん05/02/01 14:52:51
>>268
C系の「ポインタ」は「参照を値に戻す」という概念ではない。
「リファレンス」を使うJavaは基本的にプログラムでデリファ
レンスしない(Javaが自動で行う)

PHPにはあったような希ガス
0272デフォルトの名無しさん05/02/01 15:14:06
>>270
evalを使って、実行式をその都度生成。
0273デフォルトの名無しさん05/02/01 15:18:39
>>270
my $hoge = '(foo|bar)([baz]+)';
my $fuga = q/"$2,$1,moge"/;
my $piyo = 'barb';
$piyo =~ s/$hoge/$fuga/ee;
print $piyo;
027427005/02/01 15:54:10
>>272-273
ありがとうございました。
0275デフォルトの名無しさん05/02/01 16:03:18
eeには笑った。

0276デフォルトの名無しさん05/02/01 16:13:59
eval(s///ee含む)は激遅なのでループ内部などではお奨めできない。
0277デフォルトの名無しさん05/02/01 17:25:16
Return-path: <[email protected]>
Delivery-date: Mon, 11 Aug 2003 22:49:59 +0900
Received: from lupin by eqv.ne.jp with local (MailPost 5.6)
id HJGJRA-0001JO-00
for [email protected]; Mon, 11 Aug 2003 22:49:58 +0900
To: [email protected] (MINE Fujiko)
From: LUPIN III <[email protected]>
Subject: yeah!
X-mailer: My Post Tester V1.0
Message-Id: <[email protected]>
Date: Mon, 11 Aug 2003 22:49:58 +0900

Dear mine@:

Hello, Fuuujiko Chaaan!
Are you OK?

--
lupin

このメールが誰から誰へ送信されたものか、また本文を示すスクリプトを作りたいのですが
どなたか分かる方いらっしゃったらよろしくお願いします。
0278デフォルトの名無しさん05/02/01 17:42:32
>>277
> このメールが誰から誰へ送信されたものか、また本文を示すスクリプトを作りたいのですが
> どなたか分かる方いらっしゃったらよろしくお願いします。

メールのテキストから、それが誰から誰へ送信されたものなのかを
厳密に同定する技術的手段は存在しない。

もちろん「誰から誰へ送信されたものということにしてあるか」は
ヘッダから抽出可能であり、そのレベルのもので良いのなら、可能だろう。

ヘッダとボディは、「最初の空行」で分割される。

っていうか、のあたりをやるモジュールがあるはず。
0279デフォルトの名無しさん05/02/01 18:53:54
CGI・perlを使い背景に画像を持ってきたいんですがうまくいきません。
backgroundでは駄目なんでしょうか?
0280デフォルトの名無しさん05/02/01 19:12:52
>>278
> っていうか、のあたりをやるモジュールがあるはず。

http://search.cpan.org/~markov/MailTools-1.66/

がどんぴしゃりかな。
0281デフォルトの名無しさん05/02/01 19:12:54
>>279
>>1
0282デフォルトの名無しさん05/02/01 20:05:00
>>278
わかるよ
0283デフォルトの名無しさん05/02/01 23:12:40
278ではないけど
>>282
詳しく教えて下さい。
仕組み的に無理だと思うのですが。
0284デフォルトの名無しさん05/02/01 23:39:43
お願いします!
「キーボードから日本語のデータを入力し、1字づつずらしながら表示し、
ファイルにそのデータを出力する。」の方法を教えてください!



0285ゆうこりん05/02/01 23:57:41
以下のやり方を教えてください。
1、1月1日が土曜日の平年について、曜日の入力データからその月日
をすべて表示する。
2、2つのファイル{英文と日本訳}を読み込み、行数を数えながら、
表示し、新しいファイルを作成する。
マジわからなくて困ってます!よろしくお願いします!
0286デフォルトの名無しさん05/02/01 23:59:41
>>285
こういうバカが絶対に業界に来ないようにする方法って
ないものだろうか。
0287デフォルトの名無しさん05/02/02 00:01:56
>>283
>詳しく教えて下さい。
>仕組み的に無理だと思うのですが。
横からなんだが、しかも全然詳しくないんだが、
メールヘッダの送信先を偽るのは簡単だけど、ルーティング情報を隠すのは
難しいとされてるみたいだよ。
メール ルーティング情報 とかで、ぐぐってみれば?
詳しくないので、このへんで。
0288デフォルトの名無しさん05/02/02 00:30:36
>>287
詳しくない人は、頓珍漢なこと言いながら出て来るのはやめて。
0289デフォルトの名無しさん05/02/02 00:30:48
>>284
system "stty raw";
open F,">>test.txt";
while ($c = getc) {
last if ord($c) == 13;
print F $c;
}
close F;

(除ActivePerl@Windows)
0290デフォルトの名無しさん05/02/02 02:10:52
>>288 詳しくないついでに。
Received: メールの経路情報
送信メールがどのサーバーを経由して配送されたかがわかる。
Received:ヘッダは複数あるのがふつうで、
その場合は下の方にあるほど送信元となる。
0291デフォルトの名無しさん05/02/02 03:04:39
>>290
> Received: メールの経路情報
× 送信メールがどのサーバーを経由して配送されたかがわかる。
○ 送信メールがどのサーバーを経由して配送されたかがわかることになっているが、偽造可能。

> Received:ヘッダは複数あるのがふつうで、
× その場合は下の方にあるほど送信元となる。
○ その場合は下の方にあるほど送信元となることになっているが、偽造可能。
0292デフォルトの名無しさん05/02/02 03:14:09
>>291
それ以前に、Recievedにはユーザ名が入ってないって。
0293デフォルトの名無しさん05/02/02 04:59:37
ユーザ名が入っていても、それも偽造可能。
0294デフォルトの名無しさん05/02/02 07:07:09
一番下にある Received ヘッダは常に正確に発信元を示しているとは限らない。
スパマーは Received ヘッダを偽造して追跡から逃れようとするのだが、
すべての Received ヘッダを偽造することはできない。
偽造された Received ヘッダは本来の Received ヘッダの下に現れ、
通常は一目で分かるほど偽物らしいものだ。
詳しくないので、このへんで。
メールサーバは黙って相手の名乗りを信じるのではなく、
DNS 検索を行い、相手の本名を発見し、ヘッダに記録する。
0295デフォルトの名無しさん05/02/02 07:48:49
最近のSPAMって受取人アドレスのメールサーバーに直接SMTP接続して送ってくるよね?
0296デフォルトの名無しさん05/02/02 08:05:57
文字列とその繰り返す回数を入力し、文章の段落を作成し、
文章の段落を繰り返す回数の入力でデータを作成する。
(一行のデータは30文字とする。)
※wordで、直接入力で =rand(2,4)と入力するのと同様のプログラム

実行結果例:

文字入力:今日は晴れるが、明日は雨が降る。
繰り返し回数:3
段落数:2

本日は晴天なり。明日は雨が降る。本日は晴天なり。明日は雨が降
る。本日は晴天なり。明日は雨が降る。

本日は晴天なり。明日は雨が降る。本日は晴天なり。明日は雨が降
る。本日は晴天なり。明日は雨が降る。

0297デフォルトの名無しさん05/02/02 08:07:08
>296の問題が分かりません…
教えてもらえないでしょうか??
0298デフォルトの名無しさん05/02/02 08:11:07
>>296
print '文字入力:';
my $str = <>;
chomp $str;
print '繰り返し回数:';
my $count = <>;
print '段落数:';
my $p = <>;

print $str x $count, "\n\n" for(1..$p);

適当に書いたけど一応動作確認済み
0299デフォルトの名無しさん05/02/02 08:16:05
スマン。30文字の条件忘れてた

print '文字入力:';
my $str = <>;
chomp $str;
print '繰り返し回数:';
my $count = <>;
print '段落数:';
my $p = <>;

$line = $str x $count;
$line =~ s/(.{30})/$1\n/g;
print $line, "\n" for(1..$p);
0300デフォルトの名無しさん05/02/02 08:21:31
>>296
my $mojiretu = ' 文字入力:今日は晴れるが、明日は雨が降る。 ';
my $repeat = 3;
my $danraku = 2;

$_ = $mojiretu x $repeat;
$_ = "$_\n\n" x $danraku;
print;
0301デフォルトの名無しさん05/02/02 08:52:44
>>300
ありがとうございました!!
030229605/02/02 09:08:45
たびたびすみませんが

print"文字入力";
chomp($moji=<STDIN>);
print"繰り返し回数";
chomp($rep=<STDIN>);
print"段落数";
chomp($danraku=<STDIN>);

for ($i=0;$i<&danraku;$i++){

での形も教えてもらえないでしょうか?



0303デフォルトの名無しさん05/02/02 09:13:13
てめーの宿題を他人にやらせるとはいい度胸だなw
030429605/02/02 09:17:29
>>303
>>all
ごめんなさい!
どうしても分からなくて…
0305デフォルトの名無しさん05/02/02 09:19:45
>>304
for文の使い方くらい自分で調べろ。
030629605/02/02 09:30:02
>>305
for文自体は調べて分かったんですが、
複数使うやり方がよく分からないんです・・・
0307デフォルトの名無しさん05/02/02 09:41:38
>>302
もう出来てるやん…まあ一応汚染チェックとか入れてみるか。

#/usr/bin/perl
use strict;
my ($moji, $rep, $danraku, $i, $j);

print"文字入力 : ";
chomp( $moji = <STDIN> );
while( $rep !~ /^[0-9]+$/ ){
 print"繰り返し回数 : ";
 chomp ($rep = <STDIN>);
}
while($danraku !~ /^[0-9]+$/){
 print"段落数 : ";
 chomp ($danraku = <STDIN>);
}
for ( $i = 0; $i < $danraku; $i++ ){
 for ( $j = 0; $j < $rep; $j++ ){
  print $moji;
 }
 print "\n\n";
}

書き殴り動作未チェック。カキコindent用に全角スペース入り。
perl的にはこういう回すだけのやつは(1 .. $rep) とか使いたいが、
c的、for文ネストの教科書的にはこんなもんだろ。
0308デフォルトの名無しさん05/02/02 09:43:18
perlの宿題スレってありますか?
0309デフォルトの名無しさん05/02/02 09:52:33
宿題みたいなのは、cgi板のperl初心者スレでやってくれないかなあ
0310デフォルトの名無しさん05/02/02 11:39:52
18.95354 〜 25.58224 の数値の間でランダムで150件数値を生成したい,
という場合はどういう乱数の使い方をすればいいでしょうか?

$a=rand(10);

というのは 1〜10までの範囲で乱数を発生させる,というのはわかるのですが,
開始範囲が1からに固定になってしまいますよね。
乱数の範囲を指定できればいいな,と思っているのですが,こんなことってできるでしょうか?
0311デフォルトの名無しさん05/02/02 11:48:40
>>310
> $a=rand(10);
>
> というのは 1〜10までの範囲で乱数を発生させる,というのはわかるのですが,

違います。

> 乱数の範囲を指定できればいいな,と思っているのですが,こんなことってできるでしょうか?

例えば、3に4を足すと、7になるということは知っていますか?
0312デフォルトの名無しさん05/02/02 11:56:11
$ sort --version
sort (coreutils) 4.5.3
で
sort -n -k2 -k3
のようなことをしているのですがこれをperlで
実現できる手段はありませんか?

0313デフォルトの名無しさん05/02/02 11:56:31
$a=rand(1)*(25.58224-18.95354)+18.95354
0314デフォルトの名無しさん05/02/02 12:04:31
>>312
ある。
0315デフォルトの名無しさん05/02/02 12:58:54
®ist # データ更新
&sendmail # 更新データメール送信
&view # 更新後データ表示

こんな流れでやってるのですが、&sendmail でちょっと時間がかかるので
&view までモタモタしてしまいます。
&sendmail の返りを待たずに &view の処理に進ませるにはどうやるのでしょうか。
0316デフォルトの名無しさん05/02/02 13:04:24
>>315
forkしてやるとか、alarmと$SIG{ALRM}で平行に流すとかまあいろいろある。
このへんのキーワードでググってみてくれ。
0317デフォルトの名無しさん05/02/02 13:06:08
>>315
®ist # データ更新
&view # 更新後データ表示
&sendmail # 更新データメール送信

こんな流れでやるとか。
0318デフォルトの名無しさん05/02/02 14:18:28
>>316
>>317
forkで望みどおりできました。
ありがとうございました。
031931205/02/02 16:15:13
とても親切な314様のおかげで 思いどおりのsortができました。
314様 ありがとうございました
0320デフォルトの名無しさん05/02/02 20:54:21
>>319
314は、ネ申 だからな。実生活は別にして。
しかし、キミもエスパーだねぇ。
0321デフォルトの名無しさん05/02/02 21:01:13
わたしも今後、314様を見習うことにします。
0322デフォルトの名無しさん05/02/02 22:04:59
俺も2年程前Perlでスパムツール作ったことある。
Net::DNSでMXレコードを引いて、Net::SMTPで直接メール投げてた。
0323デフォルトの名無しさん05/02/03 00:15:22
( ゚Д゚)そいつはすげぇ
0324デフォルトの名無しさん05/02/03 02:47:12
ファイルを読み込んだ後に数字を入力し、その数字の行数分、読み取ったファイルからランダムに抜き出して
別のファイルに書き込むにはどうすればいいでしょうか?
0325デフォルトの名無しさん05/02/03 02:52:32
そうすればいいです
0326デフォルトの名無しさん05/02/03 03:15:48
>>324
File::Slurpでも使って、ファイルを配列に読み込み、
rand(@配列)という書式で乱数を生成し、既出行を排除しつつ
必要行数ピックアップし、出力用ファイルをopenして
そこに書き込めば良いです。
0327デフォルトの名無しさん05/02/03 08:06:55
>>324
> どうすればいいでしょうか?
ご自分で、調べ、考え、試行錯誤の上、どうしても解らないところだけ
質問して下さい。宿題丸投げスレでは、ありませんよ。
0328デフォルトの名無しさん05/02/03 14:21:50
perl -e 'open F,"read.txt";open W,">result.txt";@f=<F>;print"Number:";$a=<STDIN>;print W $f[int(rand(@f))]for(1..$a);'
※出力行重複未考慮
0329デフォルトの名無しさん05/02/03 14:30:50
>>328
> ※出力行重複未考慮
破壊検査
perl -e 'open F,"read.txt";open W,">result.txt";@f=<F>;print"Number:";$a=<STDIN>;print W splice(@f,int(rand(@f)),1)for(1..$a);';cat result.txt
でオケー
0330デフォルトの名無しさん05/02/03 14:43:07
>>324
http://search.cpan.org/~bigj/File-Random-0.17/Random.pm
0331デフォルトの名無しさん05/02/03 16:30:29
>>324
そのモジュールのrandom_lineというのがそれっぽいですが、
出力に重複を許してるような気がします。324の欲しいものは
どうなのかな?

紹介されていたアルゴリズムを利用して重複しない$N行を
抜き出すとしたらこんな感じだろうか。

while (<F>) {
if (@Line < $N) {
push @Line, {lno => $., str => $_};
} else {
if (rand($.) < $N) {
$Line[int rand($N)] = {lno => $., str => $_};
}
}
}

foreach (sort { $a->{lno} <=> $b->{lno} } @Line) {
printf W $_->{str};
}
■ このスレッドは過去ログ倉庫に格納されています