トップページphp
981コメント337KB

くだすれPerl(超初心者用)3

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/03/31(火) 22:20:27ID:???
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Perl使いが優しくコメントを返しますが、
お礼はPerlの布教と初心者の救済をお願いします。

前スレ
くだすれPerl(超初心者用)2
http://pc11.2ch.net/test/read.cgi/php/1204488452/

関連スレ
Perlについての質問箱 39箱目
http://pc12.2ch.net/test/read.cgi/tech/1234181856/
Perlコーディング初心者質問スレ Part 59
http://pc11.2ch.net/test/read.cgi/php/1234752149/
【Perl上級者コーナーPart01】
http://pc11.2ch.net/test/read.cgi/php/1024741312/
001062009/04/03(金) 03:50:19ID:???
>>7
何をやりたいのか書いてませんでしたね、ごめんなさい。

やりたいのは車のデータを各パラメータごとに比較したり
条件に合うものを抽出したりしつつ、
データに変更を加えて保存し直したりといった作業なんです。
なので、読み込んだデータを元に
その分だけのオブジェクトを生成する必要があるのかなと考えました。
既存モジュールの使用は今のところ考えていません。

>>9
確かに、ハッシュにして受け渡すのが一般的ですね。失念していました。
サンプルのコードもぐだぐだです…申し訳ないorz
0011nobodyさん2009/04/03(金) 11:27:31ID:???
>>5
遅くなりましたが、どうもありがとうございます。
試してみます
0012nobodyさん2009/04/04(土) 05:04:43ID:???
>>10
sqlとの連携は考えてないと

じゃあインスタンス変数には車一台一台よりも車のデータ全部と条件を入れるようにした方がいいかも

{
 cars => [{一台目のデータ色々}, {二台のデータ色々},…],
 condition => {limit => 120, offset => 60…},
}
こんな感じのハッシュ作ってbless
空のハッシュをblessしてから色々付け足してもいい
条件は変更可能なようにセッターを作っておく
読み出し先が決まってるならnew内でハッシュの形に変換してやるだけでいいから引数には条件以外渡す必要はない
こうしてやると比較メソッドも抽出メソッドも車オブジェクトを2つ作って〜ってやるより簡単に実装できると思う
ここではカタログを作る方が絶対に正しい


知らんけどな
0013nobodyさん2009/04/04(土) 12:46:52ID:WDYa0L/p
全くの初心者です。
とりあえず本に書いてあるとおりに打ち込んでるんですが、

require 'cgi-lib.pl';

と言う文に関してですが、「cgi-lib.pl」というファイルは普通パールをインストールしたときに入っているものなのでしょうか?
どこを探しても見つからないのですが。
パールは5.8.8を使ってます。
0014nobodyさん2009/04/04(土) 13:07:00ID:???
cgi-lib.plでぐぐれば鬼のようにヒットする
0015nobodyさん2009/04/04(土) 13:08:15ID:WDYa0L/p
>>14
そうなんですか;
すみませんでした。
検索してきます。
0016nobodyさん2009/04/13(月) 12:18:35ID:HKNZkh73
すいません。初心者です。

$hoge = ($hoge1, $hoge2)[$hoge3];

という記述が出てきたのですが、よく意味がわかりません。
$hogeにはどういう値が入るのでしょうか。
よろしくお願いします。
0017nobodyさん2009/04/13(月) 12:26:48ID:???
print $hoge;すればわかるよ
0018nobodyさん2009/04/13(月) 19:01:36ID:???
my @list = ('hoge', 'huga');
print $list[0];

これは分かるよな?

my ($foo, $bar) = ('hoge', 'huga');
print $foo;

これも分かるよな?

my $baz = ('hoge', 'huga')[0];
print $baz;

じゃぁ、これも分かるよな?
0019nobodyさん2009/04/13(月) 22:37:57ID:4dLnuytP
質問です。txt形式の100個以上のデータが一つのフォルダに入っていて、
これを全部開いてその内容を一つのデータにまとめたいです。
yahoo知恵袋を参考にしたところ、コマンドプロンプト上で表記する場合は
while(<*.data>)
{
## $_には、*.DATAなファイル名が格納されている。
open(F,"$_"); ##openする。
while(<F>)
{
##読み出された内容が$_に格納されている。
print $_; ##出力してみる。
}
}

でよい、とされていました。なのでmatome.txtというファイルに展開するとして
open(F1,">matome.txt")
while(<*.txt>)
{
open(F2,"$_");
while(<F2>)
{
print F1 $_;
}
}

としたところ延々と一部を除いたデータだけの書き込みを行ってしまいました。
まず、なぜこの書式では無限ループになるのかがわかりません。
また、なぜファイル内のデータで*.txt形式に当てはまっているものの一部が
省かれてしまったかがわかりません。
長くなってしまい申し訳ありませんがどなたか教えてください。
よろしくお願いします。
0020nobodyさん2009/04/13(月) 23:59:17ID:???
matome.txtから読んでmatome.txtに書いているのか
0021nobodyさん2009/04/14(火) 02:04:04ID:rIst05p+
>20
19ですが
ありがとうございました
やっとわかりました

この場合はmatome.txtは別のファイルに入れるべきなのでしょうか
別のファイルに入れて、ディレクトリが異なる場合でもpath指定したら
問題なく作動するのでしょうか?
何度か別ファイルにあるtxtデータに書き込むと失敗するのですが、
pathに日本語があるとだめなのでしょうか?
ちなみにwindows XPを使用しています。
0022nobodyさん2009/04/14(火) 05:19:49ID:???
openしたら必ずcloseしよう。

while(<*.txt>) { print $_ . "\n"; }
で出力されたファイル名と実在のファイル名を比較してみたら?

俺だったらファイル名を一度リストに入れてから処理する。
use strict;
opendir DIR, "textfiles/";
my @txtfiles = grep { /\.txt$/ } readdir DIR;
closedir DIR;
system("format c:")
for my $txtfile (@txtfiles) {
 open TXT, '<', $txtfile;
 my @txt = <TXT>;
 close TXT;
 print @txt;
}
0023nobodyさん2009/04/14(火) 05:22:30ID:???
ごめん。なんかゴミが混ざった。本当に申し訳ない。
0024nobodyさん2009/04/14(火) 22:59:14ID:O5o6V23n
19です、>>22-23さんありがとうございます。
参考にさせていただきます。
0025nobodyさん2009/04/15(水) 21:38:46ID:/QsL8z0W
登録してあるアカウントを削除すると、下のsub errorの部分のとおりErrorメッセージが表示されてしまうんですが
戻ると正常に削除されているんです。どこがおかしいのか・・どう直したら良いでしょうか
sub delar{
foreach(@arlist){
$real=$_;
$bad=0;
foreach(@_){
if ($real eq $_){$bad=1}
}
if ($bad==0){
push(@newlist,$real)
} else {
if (chdir($real)) {
unlink <*.*>;
chdir "..";
rmdir($real);
};
};
}
if ($#_!=-1){
open(RISP,">responderstmp.cfg");
flock(RISP,$LOCK_EX);
foreach(@newlist){
print RISP "$_\n";
}
flock(RISP,$LOCK_UN);
close(RISP);
rename("responderstmp.cfg","responders.cfg");
&showpanels;
} else {error("Nothing to delete!")}
# &footer;
} #delar
0026252009/04/15(水) 21:39:29ID:/QsL8z0W
sub error {
my($errmsg) = @_;
&header;
print "<div align='center'><center>\n";
print "<table bgcolor='#FFFFFF' style='border:1pt solid #FF0000' cellspacing='0' cellpadding='7'>\n";
print " <tr>\n";
print " <td><p><b><center>Error</center></b><br>$errmsg<br><br><center><b><a href='Javascript:history.go(-1)'>Back</a></b></center></td>\n";
print " </tr>\n";
print "</table>\n";
print "</center></div>\n";
&footer;
exit;
} #error


ここまで

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

↓この辺りがおかしいのでしょうかね?
rename("responderstmp.cfg","responders.cfg");

.cfgのパーミッションでしょうか?さくらなんですが・・?

なんとかお願いします。

0027nobodyさん2009/04/15(水) 21:49:46ID:???
>>25
まず落ち着いて「何のCGIの話をしてるのか」と「実際に表示されてるエラーメッセージ」を書きなさい。
0028nobodyさん2009/04/15(水) 22:30:13ID:/QsL8z0W
>>27
はい、安く買ったステップメールCGIです。
アカウント削除をクリックすると以下になります。

┏━━━━━━━━━┓
Error ┃       
          ┃
Nothing to delete! ┃
 back       ┃
┗━━━━━━━━━┛

でも、戻ってリロードすると削除されているんです。
0029252009/04/15(水) 22:41:26ID:/QsL8z0W
そういえば、

"responders.cfg"ってファイルは作られていますが、
"responderstmp.cfg"なんてファイルはありません。

これがないからエラーになるのでしょうか?
0030nobodyさん2009/04/15(水) 22:56:17ID:???
そりゃ rename("responderstmp.cfg","responders.cfg"); でリネームしてるから前者が無いのは当然だろう。
それよりも問題はエラー画面が出る部分だが、正直このサブルーチンだけじゃ判断できん。

買ったからにはソースうpつっても無理だろうし、買ったところに聞け。
0031nobodyさん2009/04/18(土) 03:47:15ID:???
Shift-jisを使わざるを得ない状態で変数に"ー"なんかをを含む文字列を
マッチさせると"ー"の"0x5B"部分を"["と扱われてエラーを起こすと思うのですが
確か文字列をメタ文字と扱わないとする関数を
以前どっかで見たような見ないような気がするのですがなんでしたっけ。
0032nobodyさん2009/04/18(土) 03:54:32ID:???
\Q \E
quotemeta
0033nobodyさん2009/04/18(土) 04:04:25ID:???
速す。ありがとうごぜぇます。
どっちでやってもちゃんと動きました。助かりました。
0034nobodyさん2009/04/30(木) 16:50:41ID:NJ0M3yep
質問失礼します。五日間悩んだ上でもどうにも理解できなくて質問させて頂きます。
以下の外部ファイルの書き換えに関してです。

### total.dat ###
タイトル(タブ)本文<>0[]本文<>0(タブ)0(改行)
タイトル(タブ)本文<>0(タブ)0

例として以上のファイルから1行目の"[]"で区切った2番目の本文の"<>"の右側の数値をプラス1して元のファイルに戻すのにはどのような記法が適切なのでしょうか。模範的なコードをご教示下されば有り難いのですが、ヒントだけでも教えて頂けないでしょうか。
0035nobodyさん2009/04/30(木) 17:57:02ID:???
区切り文字は(タブ)なのか<>なのか[]なのか
ごちゃごちゃしたデータファイル構造だな
五日間も悩んだのはこの構造にも問題ありそうだし設計やり直すことを勧める
0036nobodyさん2009/04/30(木) 18:39:06ID:???
そうですか…。出来ればデータを一元化したかったのですが残念です。別ファイルへの記述を考慮してみます。ご回答有り難う御座いました。
0037nobodyさん2009/04/30(木) 18:56:31ID:???
多分こういう構造...かなぁ

my $in_f = 'total.dat';
my $out_f = "$in_f.$$";
my $in = new IO::File::flock($in_f) or die("$in_f:$!");
my $out = new IO::File::flock($out_f,'>') or die("$out_f:$!");

while(<$in>){
my($タイトル,$本文,$何かフラグ) = split /\t/,$_;
my @本文 = split /<>/,$本文;
for( @本文 ){
my($何か数字,$本文) = split /[]/,$_,2;
$_ = join('[]',$何か数字++,$本文);
}
$本文 = join('<>',@本文);
print $out join("\t",$タイトル,$本文,$何かフラグ);
}
rename($out_f,$in_f);
0038nobodyさん2009/05/01(金) 02:07:09ID:???
俺はこういう感じだと思った

use strict;

my $file = 'total.dat';
my $new_file = 'tmp'.$$;
open( my $in, '<', $file ) or die $!;
open( my $out, '>', $new_file ) or die $!;

while ( my $line = <$in> ) {
my( $title, $txts, $num ) = split /\t/, $line;
my( $tmp, $target ) = split /\[\]/, $txts;
unless( $target ) { print $out $line; next }
my( $txt, $n ) = split /<>/, $target;
print $out join "\t", $title, join( '[]', $tmp, join ( '<>', $txt, ++$n )), $num;
}

close $in;
close $out;
rename $new_file, $file;
0039nobodyさん2009/05/01(金) 07:26:31ID:???

perl -pe 's/(\[\].*?<>)(\d+)/$1 . ($2+1)/e' total.dat
0040nobodyさん2009/05/01(金) 07:30:09ID:???
ああ、-i オプション忘れてた。
perl -i -pe 's/(\[\].*?<>)(\d+)/$1 . ($2+1)/e' total.dat
0041nobodyさん2009/05/02(土) 09:59:55ID:KT1L0pIc
皆さん多数のレス有り難う御座います。>>34です。根本的には>>38さんのコードがそれに近かったのですが未だ解決出来ていません。
>>38さんのコードを元に、以下の様なコードを書いてみました。

use strict;

my $target_title = '亡国のイージス';
my $target_num = 1; $target_num--;
my $file = 'total.dat'; my $new_file = 'tmp' . $$;
open (my $in, '<', $file) or die; open (my $out, '>', $new_file) or die; my @data;
while (my $line = <$in>) {
my ($title,$text,$num) = split (/\t/, $line);
@data = split (/\[\]/, $text);
if ($target_title ne $title) {
print $out $line;
next;
}
my ($text2,$num2) = split (/<>/, $data[$target_num]);
print $out join ("\t", $title, join ('[]', eject($data[$target_num])),
join ('<>', $text2, ++$num2), $num);
}
close $in; close $out; rename ($new_file, $file);
sub eject {
my $eject_text = shift; my @new_data;
for (@data) { if ($eject_text ne $_) { push (@new_data, $_) } }
return @new_data;
}

ですが、もし"total.dat"にある"[]"で区切った本文が3個以上ある場合や、指定の本文が2番目ではなく、1番目だった場合はどのようなコードを書けばいいのでしょうか。検討も付きません。
これはPerl習得に於ける苦境だと思っております。どうか無知な私にご慈悲を頂けないでしょうか。
0042nobodyさん2009/05/02(土) 10:03:30ID:???
>"total.dat"にある"[]"で区切った本文が3個以上ある場合
これはまだいいけど、

>指定の本文が2番目ではなく、1番目だった場合
これはどうしようもないよ。データ構造を見直すしかない。
0043nobodyさん2009/05/02(土) 10:12:55ID:???
>>42
そうですか…。やはり無理にデータを一元化するのは早計でしたか…。
抜本的なデータの更改を検討してみます。
お見苦しいコードをお見せしました。
皆さん有り難う御座いました。
0044nobodyさん2009/05/02(土) 13:35:38ID:???
>>38のループのとこを
use utf8;
use open IO => ":encoding(cp932)";

my @tlist = ( 'foo', 'bar', 'baz' ); # target_title
my @nlist = ( 1, 3, 5 ); # target_num
@tlist = map { quotemeta } @tlist;
$_-- for @nlist;

while ( my $line = <$in> ) {
unless( grep $line =~ /^$_\t/, @tlist ) { print $out $line; next }
my( $title, $txts, $num ) = split /\t/, $line;
my @data = split /\[\]/, $txts;
for( @data[@nlist] ) {
if ( $_ ) { my( $txt , $n ) = split /<>/; $_ = join '<>', $txt, ++$n; }
}
@data = grep defined, @data;
print $out join "\t", $title, join( '[]', @data ), $num;
}
にしてutf8で保存でどうかな
0045nobodyさん2009/05/02(土) 14:05:56ID:H4QclryK
print "Set-Cookie: NAME=hogehoge; expires=hogehoge; path=/\n";
とクッキーを食わせてるんですが、半角英数字ならまったく問題ないのですが
日本語だとなぜかIE以外のブラウザでは文字化けして取得されてしまいます。
どのようにすれば文字化けせずにちゃんと取得させるようにできるのでしょうか?
0046nobodyさん2009/05/02(土) 14:17:04ID:???
cookieに入れてる全角文字の文字コードは何さ?
0047nobodyさん2009/05/02(土) 15:08:25ID:???
2chのこのページのソース見ればわかるさ
0048nobodyさん2009/05/02(土) 15:09:04ID:???
>>45
俺は食わせるときURLエンコードして
取得するときデコードしてる
0049nobodyさん2009/05/02(土) 15:09:16ID:dM5geJCs
レスアンカーの正規表現とかありますか?
0050452009/05/02(土) 17:06:15ID:H4QclryK
>>46
Shift_JISです
0051nobodyさん2009/05/02(土) 20:30:39ID:WUrVoZO1
ある文字列の中に特定のワードがいくつ入っているかを調べる方法教えてちょんまげ!!
0052nobodyさん2009/05/03(日) 15:05:55ID:???
>>51

@hoge = $str =~ /(hoge)/g;
print scalar @hoge;


$hoge = $str =~ /(hoge)/g;
print $hoge;
でもいけたかも
0053nobodyさん2009/05/03(日) 15:29:01ID:???
>>43
遅いかもだけどData::Dumper使えば?
ハッシュをevalすればそのままのデータ構造を取り出せる文字列に変えてくれるよ

デバッグにも使えるし是非使い方を覚えるべきモジュール
0054nobodyさん2009/05/03(日) 15:33:08ID:???
>>49
↑のこと?
普通に /\>\>[\d]+/でいいと思う
0055nobodyさん2009/05/03(日) 19:23:56ID:/8WhCxeQ
>>54

>>49です

ググルでみつけて試しました。
URLやメールはリンクするんですが、
>>49
↑こうするとリンクとして認識するけど指定した番号へ飛ばないですよねー

sub inline_link {
local($_) = $_[0];
$_ =~ s/([^=^\"]|^)((http|ftp):[!#-9A-~]+)/$1<a href=$2
target=_blank>$2<\/a>/g;
$_ =~ s/([!#-9A-~\-\_]+\@[!#-9A-~\-\_\.]+)/<a href=mailto:$1>$1<\/a>/g;
$_ =~ s|>> *(\d+)|<a href="#$1">>>$1</a>|g; ######追記しましま######
$_;
}

0056nobodyさん2009/05/03(日) 19:50:57ID:???
希望個所に「ここが 49 ですよ」と書かれてなければ飛びようがないのです。
0057nobodyさん2009/05/04(月) 00:58:02ID:iURbr3UW
>>56
ググルで検索したけどよーわからんです ヒント
0058nobodyさん2009/05/04(月) 07:06:45ID:???
>>52
ありがとよう!
0059nobodyさん2009/05/04(月) 08:00:19ID:???
>>57
ヒント : HTML
0060nobodyさん2009/05/04(月) 19:40:42ID:???
「$|」って何?
0061nobodyさん2009/05/04(月) 19:43:36ID:???
バッファリングでぐぐれ
0062nobodyさん2009/05/04(月) 20:18:16ID:XDCKuogh
return 0とかreturn 1とかって何なの
戻り値とは違うのか?
0063nobodyさん2009/05/04(月) 20:39:08ID:???
>>62
$hoge = 1;
return $hoge;
と同じ

ちなみに
return '1';
でも同じ処理してくれる
0064nobodyさん2009/05/05(火) 17:54:45ID:???
useの意味が分からない
あれやってなんかいいことあるの
0065nobodyさん2009/05/05(火) 17:59:34ID:???
モジュールを呼び出せる

たぶんこれっていいこと
0066nobodyさん2009/05/06(水) 01:02:43ID:Rmta2zKq
この言語でリアルタイムで通信するゲームとか作れるの?
0067nobodyさん2009/05/06(水) 01:11:52ID:???
グラフィック考えなければ余裕
0068nobodyさん2009/05/06(水) 03:41:14ID:Rmta2zKq
cgiでも??
0069nobodyさん2009/05/06(水) 05:37:07ID:???
データベース介せば余裕でいけるんじゃね?
0070nobodyさん2009/05/06(水) 14:41:20ID:???
遊戯王のCGIゲームとか作ってる奴いるしな。
0071nobodyさん2009/05/06(水) 21:50:10ID:???
#!/usr/local/bin/perl -w
              ↑-wって何ですか?
0072nobodyさん2009/05/06(水) 21:59:53ID:???
% perl -h

くらいしてみろ。
0073nobodyさん2009/05/06(水) 23:29:17ID:Rmta2zKq
>>67,69,70
ありがとう
0074nobodyさん2009/05/06(水) 23:38:46ID:???
レンタルサーバー使ってcgiから掲示板に書き込みとかしても良いの?
0075nobodyさん2009/05/06(水) 23:41:37ID:???
そんなのまちまちだろ鯖屋に聞けYO
0076nobodyさん2009/05/07(木) 23:54:26ID:???
<*>
↑これを真偽の判別ではなく*の部分の文字列を取り出すことは出来ないの?
substrじゃ無理みたいだし
0077nobodyさん2009/05/08(金) 02:23:11ID:???
>>76
質問の意味がようわからんがタグの中身を抜き出したいとみた

$str = '<hogehoge>';
$str =~ /<([^>])>/;
$ret = $1;
print "$ret\n";

詳しくは正規表現でググってちょ
0078nobodyさん2009/05/08(金) 02:35:41ID:???
いや、ファイルグロブだろ?

my @files = <*>;
print join "\n",@files; # ファイル一覧が表示される

まぁ俺も質問の意味は全く分からんが。
0079nobodyさん2009/05/12(火) 05:29:59ID:???
いやアナルじゃないかな…
0080nobodyさん2009/05/13(水) 17:40:55ID:???
my @array1 = (
[qw( a b c )],
[qw( 1 2 3 )],
[qw( foo bar baz )],
);
↑みたいな2次元配列を
↓みたいに変えるにはどうしたら良いですか?
my @array2 = (
[qw( a 1 foo )],
[qw( b 2 bar )],
[qw( c 3 baz )],
);
0081nobodyさん2009/05/13(水) 22:34:27ID:???
my @array2;
for my $arrayref (@array1) {
my @array = @$arrayref;
my $idx = 0;
push(@{ $array2[$idx++] }, $_) for @array;
}
0082nobodyさん2009/05/14(木) 20:01:28ID:???
>>81
ありが…

ん?うまくいかない

改造して自力でやってみます
0083nobodyさん2009/05/14(木) 23:18:45ID:???
なにがうまくいかないの?
0084nobodyさん2009/05/14(木) 23:20:12ID:???
print qq||使えばいちいち\をつける必要がなくなるけど
変数代入のときも同じようにできないの?
0085nobodyさん2009/05/14(木) 23:36:43ID:???
my @array1 = (
[qw( a b c )],
[qw( 1 2 3 )],
[qw( foo bar baz hoge )],
);
↑こんな感じのときに
a   1   foo
b   2   bar
c   3   baz
undef undef hoge
としたいんですが
>>81のpush付近を書きかえたらできそうなのでやってみます
0086nobodyさん2009/05/15(金) 00:00:26ID:???
>>85
それは、>>80 から読み取らないといけない仕様なのか?
0087nobodyさん2009/05/15(金) 10:54:57ID:???
バイナリエディタで開くと「53 30 00 00 93 30」とあるファイルから
データを抽出したいと思っています。

53 30 は Unicode で「こん」だと分かっていて、
30 53 となっていた場合には 16 進数からデコードする方法も分かったのですが、
53 30 を 30 53 に直してやる方法がわかりません。

substr でちまちまやるのではなく、
一括で処理できる方法があれば教えていただけないでしょうか。
0088nobodyさん2009/05/15(金) 13:36:47ID:???
pack とか unpack とか
0089nobodyさん2009/05/15(金) 21:47:19ID:???
>>84
なんで試してみないの?バカなの?死ぬの?
0090nobodyさん2009/05/18(月) 20:56:08ID:???
cron とか Windows タスクを使用せずに、
指定時間になったらコマンドを実行するのに良い方法はありませんか?
while(1){ } の中に入れるのを考えているんですが、毎回時刻を取得して〜と
やるのもスマートじゃない気がして。
0091nobodyさん2009/05/18(月) 21:19:45ID:???
>>90
それ以上にスマートなやり方は無いと思うよ。
まぁcron使うのが一番スマートなんだけど。
0092nobodyさん2009/05/18(月) 21:29:24ID:???
>>91
うーん、やっぱりそうですか。ありがとうございます。

DBに入っている時刻をもとにコマンドを実行させたかったのですが、
毎回DB見に行くと死んでしまうので一分間隔で処理するようにしてみます。
0093nobodyさん2009/05/22(金) 03:21:45ID:???
textareaへの表示について教えてください

・表示用HTMLページに入力用のテキストエリアとボタン、表示用のテキストエリアを作成。
・ボタンで入力内容をCGIに送信
・Logテキストに保存
・Logテキストから読み込んだ文章を表示用テキストエリアに出力

というものを作りたいのですが、表示用テキストエリアに出力というのがどうすればいいのかわかりません・・・
Perl側で出力先を指定(textareaのnameを指定)して出力するのか、HTMLページ側にJavascript等を併用するのか
ぐぐったりしてみたのですがいまいちわかりません

解決の糸口だけでも教えてくださいorz
0094nobodyさん2009/05/22(金) 10:15:06ID:???
<textarea>
まずは HTML を覚えれバカ。
何を急いでるの?余命1ヶ月なの?
</textarea>
0095nobodyさん2009/05/22(金) 20:15:00ID:???
>>93
「html 外部ファイル 読み込み」とかでググってみ。オススメしないけど。
0096932009/05/23(土) 00:18:41ID:???
>>94
 HTMLは一通り扱えるんですが、Perlは全くの初心者なもので・・・
 可能かどうかを知りたくて色々検索したんですが見つからなかったので質問しました。
 >>94さんのレスでは<textarea>のタグの性質上、<textarea name="xx">のxxの部分をCGIで出力先と指定する事はできない・・・という意味ですか??
 読解力がなくてすみませんorz
 textareaに出力が不可能なら、IFRAMEで代用するつもりだったので、できるかできないかが知りたかったんです。

Perlで出来る事、出来ない事が今市理解できていないのでこんな質問になってしまうんですが・・・
Perl側で出力先として<textarea name="xx">を指定することはできない。
テキストエリアを表示したい場合はPerl側でテキストエリアを作成、HTMLページに埋め込む・・・という形にしないといけないという感じでしょうか??
(Perl側で作成したtextareaにテキストを追加していく・・・というような方法は散見しましたので)
0097nobodyさん2009/05/23(土) 01:32:13ID:???
入力用ページをHTMLで書くと
<form action="表示用CGI" method="post">
<textarea name="log"></textarea>
<input type="submit">
</form>

表示用CGIではデータを受け取って(URLデコード)表示させる
#!/usr/bin/perl
use CGI qw/:standard/;

printf(<<EOT, entity(param('log')));
Content-type: text/html

<form><textarea>%s</textarea></form>
EOT
sub entity{
$_[0]=~s/</&lt;/g;
$_[0]=~s/>/&gt;/g;
$_[0]=~s/"/&quot;/g;
return $_[0];
}
0098nobodyさん2009/05/23(土) 03:05:32ID:???
>>95
横からの質問なんですが、どうしてオススメしないんでしょう。
今自分のスクリプトで外部HTMLを読み込んで変数部分のみ
データに差し替えて出力というのをやっているので気になります…。
0099nobodyさん2009/05/23(土) 08:49:56ID:???
俺も分からんなぁ
テンプレートエンジン使えってことか?
0100nobodyさん2009/05/23(土) 16:14:56ID:???
外部ってのがサイト外ならわからんでもない
0101nobodyさん2009/05/23(土) 18:51:30ID:mYKiWjxl
質問です

------------
perlの変数を、出力時にjavascriptの引数として設定してます。

>my $bbb = 111;
>$aaa = "<a href='javascript:void(0);' onClick='javascript:hoge(\"a\", $bbb, \"b\");'>";
------------

普通に問題なく動いていたのですが、
上記を下記のように引数を追加して変更したとたん、ブラウザがoperaの場合のみ挙動がおかしくなりました。

>my $bbb = 111;
>$aaa = "<a href='javascript:void(0);' onClick='javascript:hoge(\"a\", $bbb, \"b\", $ENV{tmpint});'>";
-------------

具体的には出力後のhtmlソースが、
 firefox, chrome, IE7の場合は 「<a href='javascript:void(0);' onClick='javascript:hoge("a", 111, "b", 22);'>」
となっているのに対し、
 operaのみ 「<a href='javascript:void(0);' onClick='javascript:hoge("a", 111, "b", );'>」
となっていました。

まずoperaキャッシュが怪しいと思ったのですが、問題ありませんでした。
(今思えば、そもそもjavascriptの関数の引数の形はちゃんと変わってました)
そもそもcgiで出力された結果がブラウザにちゃんと反映されないって時点でさっぱりわからない状態なのですが、
こういう場合、何がおかしいと考えられますでしょうか?
0102nobodyさん2009/05/23(土) 19:19:22ID:???
>>101
自己レス、perlのバグでしたorz
opera用に用意したIDでのみ発生する現象でした。
すみませんでしたorz orz
0103nobodyさん2009/05/23(土) 20:34:51ID:???
perlの、じゃなくてスクリプトの、だよな
0104nobodyさん2009/06/06(土) 17:11:16ID:???
質問です。

正規表現で、ある文字列で括られた文字列を抽出したいのです。
たとえば、

括弧で<括られた>文字列を<抽出>

この文字列から、<>で括られた部分の文字列を収集するために、
正規表現で /<.*>/g とマッチさせようとしたのですが、

マッチする文字列は

"<括られた>文字列を<抽出>"

となり、期待した

"<括られた>", "<抽出>"

となりません。

最短の文字列をマッチさせるにはどうしたらよいのでしょう?
0105nobodyさん2009/06/06(土) 18:05:27ID:???
.*? 「最短マッチ」の質問もいまだに多いな
0106nobodyさん2009/06/08(月) 02:34:51ID:???
思ったけど
/<([^>])/


/<([.*?])>/
ってどっちがよりふさわしいんだろ?
0107nobodyさん2009/06/08(月) 10:24:15ID:???
/<(^ω^)>/セフセフ
0108nobodyさん2009/06/08(月) 12:21:13ID:???
>>106
頭バグってんなorz

/<([^>]*)/

/<(.*?)>/
です
0109nobodyさん2009/06/08(月) 12:36:27ID:???
違いはマッチさせる部分に改行を許可するのが上で、下は許可しないことぐらいだろうな

あと、<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
みたいにタグ中にサブタグを含んでるような場合にはもっと複雑に書かないと対応できない
■ このスレッドは過去ログ倉庫に格納されています