Perlについての質問箱 15箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
05/01/17 18:11:32"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お前の腕次第だ。馬鹿。
asp使ってもお前にはすごいWebアプリが作れるとは思えない。
0233デフォルトの名無しさん
05/01/31 02:53:09ウェブ開発で不可能なことは無いしね。作る人次第だ
0234Hiro58
05/01/31 02:58:55visualC#でもやってみようかと。。どちらにしろ、そこまで大きな依頼は
無いのでやはり必要ないかもしれないですね(スイマセン)今のところHPの管理ページ
のみなので。(ショッピングカートや在庫管理など)
>>231
Webアプリケーションフレームワークありました。とりあえず「Sledge」を見つけたのですが、スクリーンショット
など無くて、どのようなもんか想像できないです(泣)
0235デフォルトの名無しさん
05/01/31 03:03:340236デフォルトの名無しさん
05/01/31 04:02:05WINの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:33Cやshでも使ってやれよ。
0238デフォルトの名無しさん
05/01/31 15:41:38>のみなので。(ショッピングカートや在庫管理など)
B2C?
SSL とか 負荷分散とか FW までヤラサレル悪寒 (((( ;´ω`))) カクカクプルプル
0239デフォルトの名無しさん
05/01/31 21:18:27if($a==/[abcdefghi]/){〜〜〜}
でいいのでしょうか?
0240デフォルトの名無しさん
05/01/31 21:23:290241デフォルトの名無しさん
05/01/31 21:23:53やりたいのはこういうことかな
if($a !~ /[^abcdefghi]/){〜〜〜}
0242デフォルトの名無しさん
05/01/31 21:25:09if ($a =~ /\A[abcdefghi]\z/) { 〜〜〜 }
0243241
05/01/31 21:29:42=~でしたね
すみませんでした。
0244デフォルトの名無しさん
05/01/31 21:35:54if ($a =~ tr/abcdefghi// == 1) {〜〜〜}
0245デフォルトの名無しさん
05/01/31 21:38:12if (-1 < index('abcdefghi', $a)) {
;
}
0246デフォルトの名無しさん
05/01/31 21:40:15\Z のZは、小文字でも良いんだっけか?
if ( $a =~ /\A[a-i]\Z/ ) { 〜〜〜 }
0247デフォルトの名無しさん
05/01/31 21:54:30違うものだよ。
\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大文字Zだと$aの中身が "a\n" でもマッチしちゃうのね。
納得。お勉強になった。つか、ずっと勘違いしてた。
ご指摘、サンクスです。
0249デフォルトの名無しさん
05/01/31 22:20:58と書く前にさっとマニュアルを見るという行動が
なぜ出来ないのかと。
0250デフォルトの名無しさん
05/01/31 22:30:12\z って、最近実装されたんでね?
0251デフォルトの名無しさん
05/01/31 23:22:45御親切に御回答いただき有難うございます。
残念ながら御指摘の点を以下のように変更し実施しましたが、
文字化けの現象を回避するには至りませんでした。
暇を見付けて、もう少し検証を続けてみようと思っております。
有難うございました。
use encoding "euc-jp";
0252デフォルトの名無しさん
05/01/31 23:25:32> \z って、最近実装されたんでね?
それで?
いや、だから、
% perldoc perlre
に相当するアクションを行なわないのはなぜかと。
どういう問題があるの?
Winだと、添付マニュアルは、htmlで提供されてい
たりするんだっけ。
0253デフォルトの名無しさん
05/01/31 23:32:00それ間違ってねえ?
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しょうか?
0257デフォルトの名無しさん
05/02/01 01:09:32質問する前にsearch.cpan.orgで調べようと思わんのか?あーん?
0258デフォルトの名無しさん
05/02/01 01:11:05まず、その配列の配列の実装方法わかってる?
(@arr1, @arr2)じゃ駄目、リファレンスを使う。
リファレンスについて調べれば自ずと方法がわかるはずだ。
0259デフォルトの名無しさん
05/02/01 01:11:20なにがしたいのかよくわからんが
$array[1] = 30;
ではいかんのか。
0260デフォルトの名無しさん
05/02/01 01:11:46$num[1] = @{$array[1]};
0261デフォルトの名無しさん
05/02/01 01:19:530262デフォルトの名無しさん
05/02/01 02:28:00頭悪いね
>>259
超頭悪いね
0263デフォルトの名無しさん
05/02/01 02:38:12超絶的に頭悪いね。
0264デフォルトの名無しさん
05/02/01 08:25:01# @array[学校のクラス][各クラスにいる生徒の数]
# では、あやしいので、
# @array[学年][クラス] [生徒]= 各生徒のデータ
# のとき
# (1年2組)
my $num = @{ $array[1][2] };
0265デフォルトの名無しさん
05/02/01 11:45:43↑これってどういう意味…?
特に最後の『\@』の意味がわからん…。
誰か教えてくれ〜。
0266デフォルトの名無しさん
05/02/01 11:47:37参照渡し
0267デフォルトの名無しさん
05/02/01 12:04:14「デリファレンス」でググるとピンポイントですごい命中
0268デフォルトの名無しさん
05/02/01 13:05:37ホントだ。「デリファレンス」って Perl 以外では使われない用語?
0269デフォルトの名無しさん
05/02/01 14:52:03むしろ日本(ry
0270デフォルトの名無しさん
05/02/01 14:52:21$fuga = '$2,$1,moge';
# ...
$piyo =~ s/$hoge/$fuga/;
こんな感じに動的に$fugaの中の$1,$2を評価したいのですが、
どんな方法を使えばいいでしょうか。
0271デフォルトの名無しさん
05/02/01 14:52:51C系の「ポインタ」は「参照を値に戻す」という概念ではない。
「リファレンス」を使うJavaは基本的にプログラムでデリファ
レンスしない(Javaが自動で行う)
PHPにはあったような希ガス
0272デフォルトの名無しさん
05/02/01 15:14:06evalを使って、実行式をその都度生成。
0273デフォルトの名無しさん
05/02/01 15:18:39my $hoge = '(foo|bar)([baz]+)';
my $fuga = q/"$2,$1,moge"/;
my $piyo = 'barb';
$piyo =~ s/$hoge/$fuga/ee;
print $piyo;
0275デフォルトの名無しさん
05/02/01 16:03:180276デフォルトの名無しさん
05/02/01 16:13:590277デフォルトの名無しさん
05/02/01 17:25:16Delivery-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> このメールが誰から誰へ送信されたものか、また本文を示すスクリプトを作りたいのですが
> どなたか分かる方いらっしゃったらよろしくお願いします。
メールのテキストから、それが誰から誰へ送信されたものなのかを
厳密に同定する技術的手段は存在しない。
もちろん「誰から誰へ送信されたものということにしてあるか」は
ヘッダから抽出可能であり、そのレベルのもので良いのなら、可能だろう。
ヘッダとボディは、「最初の空行」で分割される。
っていうか、のあたりをやるモジュールがあるはず。
0279デフォルトの名無しさん
05/02/01 18:53:54backgroundでは駄目なんでしょうか?
0280デフォルトの名無しさん
05/02/01 19:12:52> っていうか、のあたりをやるモジュールがあるはず。
http://search.cpan.org/~markov/MailTools-1.66/
がどんぴしゃりかな。
0281デフォルトの名無しさん
05/02/01 19:12:54>>1
0282デフォルトの名無しさん
05/02/01 20:05:00わかるよ
0283デフォルトの名無しさん
05/02/01 23:12:40>>282
詳しく教えて下さい。
仕組み的に無理だと思うのですが。
0284デフォルトの名無しさん
05/02/01 23:39:43「キーボードから日本語のデータを入力し、1字づつずらしながら表示し、
ファイルにそのデータを出力する。」の方法を教えてください!
0285ゆうこりん
05/02/01 23:57:411、1月1日が土曜日の平年について、曜日の入力データからその月日
をすべて表示する。
2、2つのファイル{英文と日本訳}を読み込み、行数を数えながら、
表示し、新しいファイルを作成する。
マジわからなくて困ってます!よろしくお願いします!
0286デフォルトの名無しさん
05/02/01 23:59:41こういうバカが絶対に業界に来ないようにする方法って
ないものだろうか。
0287デフォルトの名無しさん
05/02/02 00:01:56>詳しく教えて下さい。
>仕組み的に無理だと思うのですが。
横からなんだが、しかも全然詳しくないんだが、
メールヘッダの送信先を偽るのは簡単だけど、ルーティング情報を隠すのは
難しいとされてるみたいだよ。
メール ルーティング情報 とかで、ぐぐってみれば?
詳しくないので、このへんで。
0288デフォルトの名無しさん
05/02/02 00:30:36詳しくない人は、頓珍漢なこと言いながら出て来るのはやめて。
0289デフォルトの名無しさん
05/02/02 00:30:48system "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:52Received: メールの経路情報
送信メールがどのサーバーを経由して配送されたかがわかる。
Received:ヘッダは複数あるのがふつうで、
その場合は下の方にあるほど送信元となる。
0291デフォルトの名無しさん
05/02/02 03:04:39> Received: メールの経路情報
× 送信メールがどのサーバーを経由して配送されたかがわかる。
○ 送信メールがどのサーバーを経由して配送されたかがわかることになっているが、偽造可能。
> Received:ヘッダは複数あるのがふつうで、
× その場合は下の方にあるほど送信元となる。
○ その場合は下の方にあるほど送信元となることになっているが、偽造可能。
0292デフォルトの名無しさん
05/02/02 03:14:09それ以前に、Recievedにはユーザ名が入ってないって。
0293デフォルトの名無しさん
05/02/02 04:59:370294デフォルトの名無しさん
05/02/02 07:07:09スパマーは Received ヘッダを偽造して追跡から逃れようとするのだが、
すべての Received ヘッダを偽造することはできない。
偽造された Received ヘッダは本来の Received ヘッダの下に現れ、
通常は一目で分かるほど偽物らしいものだ。
詳しくないので、このへんで。
メールサーバは黙って相手の名乗りを信じるのではなく、
DNS 検索を行い、相手の本名を発見し、ヘッダに記録する。
0295デフォルトの名無しさん
05/02/02 07:48:490296デフォルトの名無しさん
05/02/02 08:05:57文章の段落を繰り返す回数の入力でデータを作成する。
(一行のデータは30文字とする。)
※wordで、直接入力で =rand(2,4)と入力するのと同様のプログラム
実行結果例:
文字入力:今日は晴れるが、明日は雨が降る。
繰り返し回数:3
段落数:2
本日は晴天なり。明日は雨が降る。本日は晴天なり。明日は雨が降
る。本日は晴天なり。明日は雨が降る。
本日は晴天なり。明日は雨が降る。本日は晴天なり。明日は雨が降
る。本日は晴天なり。明日は雨が降る。
0297デフォルトの名無しさん
05/02/02 08:07:08教えてもらえないでしょうか??
0298デフォルトの名無しさん
05/02/02 08:11:07print '文字入力:';
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:05print '文字入力:';
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:31my $mojiretu = ' 文字入力:今日は晴れるが、明日は雨が降る。 ';
my $repeat = 3;
my $danraku = 2;
$_ = $mojiretu x $repeat;
$_ = "$_\n\n" x $danraku;
print;
0301デフォルトの名無しさん
05/02/02 08:52:44ありがとうございました!!
0302296
05/02/02 09:08:45print"文字入力";
chomp($moji=<STDIN>);
print"繰り返し回数";
chomp($rep=<STDIN>);
print"段落数";
chomp($danraku=<STDIN>);
for ($i=0;$i<&danraku;$i++){
での形も教えてもらえないでしょうか?
0303デフォルトの名無しさん
05/02/02 09:13:130304296
05/02/02 09:17:29>>all
ごめんなさい!
どうしても分からなくて…
0305デフォルトの名無しさん
05/02/02 09:19:45for文の使い方くらい自分で調べろ。
0306296
05/02/02 09:30:02for文自体は調べて分かったんですが、
複数使うやり方がよく分からないんです・・・
0307デフォルトの名無しさん
05/02/02 09:41:38もう出来てるやん…まあ一応汚染チェックとか入れてみるか。
#/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:180309デフォルトの名無しさん
05/02/02 09:52:330310デフォルトの名無しさん
05/02/02 11:39:52という場合はどういう乱数の使い方をすればいいでしょうか?
$a=rand(10);
というのは 1〜10までの範囲で乱数を発生させる,というのはわかるのですが,
開始範囲が1からに固定になってしまいますよね。
乱数の範囲を指定できればいいな,と思っているのですが,こんなことってできるでしょうか?
0311デフォルトの名無しさん
05/02/02 11:48:40> $a=rand(10);
>
> というのは 1〜10までの範囲で乱数を発生させる,というのはわかるのですが,
違います。
> 乱数の範囲を指定できればいいな,と思っているのですが,こんなことってできるでしょうか?
例えば、3に4を足すと、7になるということは知っていますか?
0312デフォルトの名無しさん
05/02/02 11:56:11sort (coreutils) 4.5.3
で
sort -n -k2 -k3
のようなことをしているのですがこれをperlで
実現できる手段はありませんか?
0313デフォルトの名無しさん
05/02/02 11:56:310314デフォルトの名無しさん
05/02/02 12:04:31ある。
0315デフォルトの名無しさん
05/02/02 12:58:54&sendmail # 更新データメール送信
&view # 更新後データ表示
こんな流れでやってるのですが、&sendmail でちょっと時間がかかるので
&view までモタモタしてしまいます。
&sendmail の返りを待たずに &view の処理に進ませるにはどうやるのでしょうか。
0316デフォルトの名無しさん
05/02/02 13:04:24forkしてやるとか、alarmと$SIG{ALRM}で平行に流すとかまあいろいろある。
このへんのキーワードでググってみてくれ。
0317デフォルトの名無しさん
05/02/02 13:06:08®ist # データ更新
&view # 更新後データ表示
&sendmail # 更新データメール送信
こんな流れでやるとか。
0318デフォルトの名無しさん
05/02/02 14:18:28>>317
forkで望みどおりできました。
ありがとうございました。
0319312
05/02/02 16:15:13314様 ありがとうございました
0320デフォルトの名無しさん
05/02/02 20:54:21314は、ネ申 だからな。実生活は別にして。
しかし、キミもエスパーだねぇ。
0321デフォルトの名無しさん
05/02/02 21:01:130322デフォルトの名無しさん
05/02/02 22:04:59Net::DNSでMXレコードを引いて、Net::SMTPで直接メール投げてた。
0323デフォルトの名無しさん
05/02/03 00:15:220324デフォルトの名無しさん
05/02/03 02:47:12別のファイルに書き込むにはどうすればいいでしょうか?
0325デフォルトの名無しさん
05/02/03 02:52:320326デフォルトの名無しさん
05/02/03 03:15:48File::Slurpでも使って、ファイルを配列に読み込み、
rand(@配列)という書式で乱数を生成し、既出行を排除しつつ
必要行数ピックアップし、出力用ファイルをopenして
そこに書き込めば良いです。
0327デフォルトの名無しさん
05/02/03 08:06:55> どうすればいいでしょうか?
ご自分で、調べ、考え、試行錯誤の上、どうしても解らないところだけ
質問して下さい。宿題丸投げスレでは、ありませんよ。
0328デフォルトの名無しさん
05/02/03 14:21:50※出力行重複未考慮
0329デフォルトの名無しさん
05/02/03 14:30:50> ※出力行重複未考慮
破壊検査
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:07http://search.cpan.org/~bigj/File-Random-0.17/Random.pm
0331デフォルトの名無しさん
05/02/03 16:30:29そのモジュールの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};
}
■ このスレッドは過去ログ倉庫に格納されています