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

Perlコーディング初心者質問スレ Part 49

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/05/31(水) 04:32:28ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0046nobodyさん2006/06/01(木) 19:05:28ID:???
>>45
あんた優しすぎw
0047nobodyさん2006/06/01(木) 19:24:16ID:???
>>45
こ、これが大人の余裕ってやつなのか…?
0048nobodyさんNGNG
ここのリンク貼るだけでええやん
http://perl.misty.ne.jp/function02/split.html
0049nobodyさん2006/06/01(木) 19:41:05ID:???
.htmlで
<!--start-->
cgiからの書込み
<!--end-->
って出来るのを最近知ったんですがどういう風に書くんですか?
ネットで探してもこのスクリプトが載ってないのだが・・・。
0050nobodyさん2006/06/01(木) 19:45:57ID:???
SSI exec でぐぐれ?
0051nobodyさん2006/06/01(木) 19:48:35ID:???
SSIは関係無い

テンプレートとなるHTMLを1行ずつ読み込む
<!--start-->が現れたら処理開始
<!--end-->が現れたら処理終了

そんなことよりも(すごい巨大なデータでなければ)
<!--INSERT-->とかを置換した方がスマートかな
0052nobodyさんNGNG
意味不明情報小出な質問大杉
0053nobodyさん2006/06/01(木) 19:56:54ID:???
質問が意味分からないのに良く答えるなぁ
0054nobodyさん2006/06/01(木) 19:57:40ID:???
>>51
む?
「 .htmlで 」 って拡張子でかいてるから、HTMLファイルにアクセスしてやりたいってことじゃないの?
エスパー失敗?
0055nobodyさん2006/06/01(木) 20:09:17ID:???
テンプレートファイルを用意して、それをCGIでごにょごにょしてから表示する方法
を求めてると判断した次第

>54
SSIだったら<!--#exec 〜-->って表記をするはずだし、startとendとペアで記述するもんじゃないから
SSIは違うんじゃね?と思った

よく見たらいきなりスバっと書きすぎてたかな
気分を害してたらゴメ
0056nobodyさん2006/06/01(木) 20:51:11ID:???
本人だが>>55の言うとおりです。
そんな感じのを教えてほしいわけです。
宜しくお願いします。
0057nobodyさん2006/06/01(木) 20:55:56ID:???
HTML::Template でも使えばええがな('A`)
0058nobodyさん2006/06/01(木) 20:57:12ID:???
>>56
多くの住人もエスパーさんも「そんな感じの」ではわからんのです。
>>55の冒頭が「やりたいこと」だったら、>>51とか。

「だから>>51のやりかたを…」とか言われると果てしなく続くのです。
0059nobodyさん2006/06/01(木) 21:03:32ID:???
>>58
その辺の事が分からないので詳しく教えてほしいのです。
0060nobodyさん2006/06/01(木) 21:04:54ID:???
>56
>57でもOKだけど
一応考え方の参考って事で・・・(略記だけど)
my %template;
$template{##TITLE##}="あ〜";
$template{##BODY##}="う〜";
open(FH, "テンプレートHTML"); read(FH, $templatehtml, (-s FH)); close(FH);
foreach(keys(%template)){
 $templatehtml=~s/$_/$template{$_}/g;
}
print $templatehtml;

HTML には挿入したい場所に##TITLE##とかを書いておけばOKです
0061nobodyさんNGNG
放置すればいいのに
0062nobodyさん2006/06/01(木) 21:09:47ID:???
60だけど、これ以上は書かないつもり
これ以上書くならテンプレート形式を使ってるスクリプトを眺めろとしか言えないし
0063nobodyさん2006/06/01(木) 21:10:01ID:???
be付けてる人って、いつも煽ってばっかりだよね。
0064nobodyさん2006/06/01(木) 21:10:34ID:???
>>63
ニュルーしてあげるのもやさしさですw
0065nobodyさんNGNG
うわぁ…
0066nobodyさん2006/06/01(木) 21:42:09ID:???
ではこのような事をなんと言うのかお教え下さい。
0067nobodyさん2006/06/01(木) 21:50:08ID:???
>66
散々単語が出てきてるのに・・・おまえもう来るなカス
0068nobodyさん2006/06/02(金) 00:14:24ID:???
テキストに[A-z]を書き出すにはどうすればいいですか?
0069nobodyさんNGNG
print a..z;

とか
0070nobodyさん2006/06/02(金) 00:43:27ID:???
>>69
できましたありがとうございます

[Aa][Aa]などのような場合はどうすればよいでしょうか?
0071nobodyさん2006/06/02(金) 00:45:57ID:???
日本語でおk
0072nobodyさん2006/06/02(金) 01:30:15ID:???
ここでESPを発揮!

print lc().uc() for (a..z);
0073nobodyさん2006/06/02(金) 01:31:18ID:???
>>72
いやいや敢えてこんな感じで。

my $m = 25;
$_ -= $m--, print chr $_ - 32, chr and --$m for reverse 97..122;
0074nobodyさん2006/06/02(金) 01:43:41ID:???
なかなかやるな!
0075nobodyさん2006/06/02(金) 02:16:24ID:???
>>72>>73
ありがとうございました

それから、マイドキュメントにあるホームページアップ用のhtmlファイルのjpgを全てpngにしたいんですが
どのようにすればよいですか?
いちおうこんな感じにやってみたんですがウンともスンともいいませんでした

open IN,"./1.html";
while ( $word = <IN> ){ $words .= $word;}
close IN;
open ADD,">./1.html";
$words =~ s/jpg/png/g;
print ADD "$words";
close ADD;

どこがミスってますか?
0076nobodyさんNGNG
拡張子変えるだけでいいの?
0077nobodyさん2006/06/02(金) 02:37:17ID:???
>>76
はい!
htmlのソースの中にあるjpgをpngに変えるのが目的です
0078nobodyさん2006/06/02(金) 03:12:56ID:???
じゃ今度は僕がテレパス化に挑戦。

>>77
全部の open と close の後に or die $! って書いてみよう。

open IN, "./1.html" or die $!;
...中略...
close IN or die $!;

というふうにね。
困った時に時々原因を教えてくれるおまじないだよ。
これからは必ず付けるようにしてね♪
0079nobodyさん2006/06/02(金) 03:29:31ID:???
>>78
うーん、、、やはりなにも起こりません。
0080nobodyさん2006/06/02(金) 03:49:36ID:???
問題を細かくする事がデバッグのコツ。

まず、置換・書き込み部分はコメントアウトして、読み込んだ後に
$words を print して正常に読み込めているか確かめる。

正常に読み込めているのを確認したら、置換部分を有効にして、置換した後に
$words を print して本当に置換されているか確かめる。

正常に置換されていたら、書き込み部分を有効にして、書き込みファイル名を変えてみる。
・書き込み先のパスをフルパスで指定してみて、正常に書き込めるか確かめる
・存在しないファイル名を指定して、新規作成してみる
・既存のファイル名を指定して、上書きしてみる

これだけやれば原因がわかるはず。
0081792006/06/02(金) 04:02:27ID:???
>>80
とりあえずこんな感じでテストしてみました
デスクトップのaフォルダの中に1.htmlとtest.pl
# test.plの中身
$name = "./1.html";
open OUT,">>$name";
print OUT "test\n";
close OUT;

これでコマンドプロンプトから実行してもだめでした
0082nobodyさん2006/06/02(金) 04:43:31ID:???
一応聞くけど、hello world は動くの?
でなけりゃ一回ファイル名変えてやってみ。
たまに自分のアホなスクリプト実行したせいでファイルがロックされてる場合がある。
ソース自体は普通みたいだから、絶対なんかヘンなことしてるしw
0083nobodyさん2006/06/02(金) 04:59:21ID:???
openのあとエラートラップしてみたら?
open errorだったりして…
0084nobodyさん2006/06/02(金) 05:32:21ID:???
関連付けされてねぇんじゃ?
0085nobodyさん2006/06/02(金) 09:47:40ID:???
$a1 ="あ";
$a2 ="い";
$a3 ="う";

$a50="ん";

このスカラー変数を、連結して表示したい場合、
print $a1.$a2.$a3.〜$a50;

perlでは、このような表記の仕方しかないでしょうか?
0086nobodyさん2006/06/02(金) 09:55:34ID:???
$sname='a';
while(1..50){
 $tmpsname = $sname . $_;
 $val = \${$tmpsname};
 $renketu .= $val;
}

すげぇテキトーw
つかね、配列使ってください
0087nobodyさん2006/06/02(金) 10:15:26ID:???
最近みんな優しいなあ・・・
0088nobodyさん2006/06/02(金) 10:54:24ID:???
my @Hiragana = qw(
  あ い う え お
  か き く け こ
....
  わ を ん
);
local $, = "";
print @hiragana;
qwはタブも改行もスペース扱いしてくれるぞ
0089nobodyさん2006/06/02(金) 10:55:50ID:???
あ、
print @Hiragana;
ちなみに$a50="ん";にはならんぞ。50音て50個じゃないから
0090nobodyさん2006/06/02(金) 10:59:55ID:???
>>86は間違い
リファレンスを連結している
my $sname='a';
print join '', map { ${"$sname.$_"} } (1..50);

動かしてないがこれでよくね?
0091nobodyさん2006/06/02(金) 11:22:34ID:???
最近 use strict してたから、そういう記法もあったの忘れてたな・・・。

とりあえずグローバル変数やたら定義すると面倒で適わんね。
0092nobodyさん2006/06/02(金) 11:25:06ID:???
今携帯だから確認出来ないけど、\ は要りませんでしたか。


… 実は map の使い方というか使う意義がわかんねw
あとでリファレンス立ち読みしてみるかにゃ
0093nobodyさん2006/06/02(金) 11:35:03ID:???
日本語が不自由な質問に携帯から答えたおまいは優しいな・・・
0094nobodyさん2006/06/02(金) 13:54:21ID:???
この優しさが怖い
0095nobodyさん2006/06/02(金) 14:26:56ID:???
my @hiragana = qw(あ い う え お か き く け こ
さ し す せ そ た ち つ て と な に ぬ ね の
は ひ ふ へ ほ ま み む め も や ゆ よ
ら り る れ ろ わ を ん);
print map{${$_->[0]} = $_->[1]}map{['a'.$_ ,$hiragana[$_-1]]}(1..46);

なんか質問の主旨とは違うよーな気もするが
0096nobodyさん2006/06/02(金) 15:05:28ID:???
なんでデリファレンスやねん

0097nobodyさん2006/06/02(金) 15:25:35ID:???
>90
ん〜、エラーっすねぇ
Can't use string ("a.1") as a SCALAR ref while "strict refs" in use at /test.cgi line 16.

${"a$_"} にしたら
Can't use string ("a1") as a SCALAR〜
で同じエラー

俺にゃ難しい宿題だw
0098nobodyさん2006/06/02(金) 16:09:13ID:lBhNFSRP
$s = "aあいうえおかきくけこ";
${"@{[substr($s,0,1]}$_"}=substr($s,$_*2-1,2)for(1..length($s)/2); #ここまでセットアップ

print join '', map ${"a$_"}, (1..10); # 好きな数だけloopすれば?
0099nobodyさん2006/06/02(金) 16:18:21ID:???
>>85
print eval(join('.', map{ '$a'.$_ } (1..50)));
0100nobodyさんNGNG
Perl臭ぇーッ!!
0101nobodyさん2006/06/02(金) 17:16:07ID:???
>>97
当然 no strict 'refs';の前提だが。
シンボリックリファレンス使ってるだろ?
0102nobodyさん2006/06/02(金) 17:22:15ID:???
あ、コピーしたときにドット入ったんだな。抜いてくれ

no strict 'refs';
my $sname='a';
print join '', map { ${"$sname$_"} } (1..50);
0103nobodyさん2006/06/02(金) 18:06:46ID:???
>>100
文句多いな。
local $r = sub{((@_[0] > 1) ? $r->(@_[0]-1) : ''). eval('$a'.@_[0])};
print $r->(50);
0104nobodyさん2006/06/02(金) 20:13:53ID:???
やったー Hello World できたよ\(^o^)/

sub p { my $n = shift; my $p; ($p = sub { print chr($n += shift); $p })->() }

p(0x48)->(0x1D)->(0x07)->(0x00)->(0x03)->(-0x43)->(-0x0C)->
(0x57)->(-0x08)->(0x03)->(-0x06)->(-0x08)->(-0x43)->(-0x17);
0105nobodyさん2006/06/02(金) 20:16:51ID:???
$test=1; # この状態ではシンボリック
print $test; # ここで実体化(ハード)
代入する段階でハードリファレンスってどうやるの?
0106nobodyさん2006/06/02(金) 20:22:18ID:???
日本語でおk
0107nobodyさん2006/06/02(金) 20:22:33ID:???
日本語でおk
0108nobodyさん2006/06/02(金) 20:23:28ID:???
久々にケコーンしたw
0109nobodyさん2006/06/02(金) 20:24:21ID:???
ふつつかものだけど幸せにしてね('A`*)
0110nobodyさん2006/06/02(金) 20:25:29ID:???
男同士だったらどうすんだよ
0111nobodyさん2006/06/02(金) 20:35:06ID:???
問題なく結合します。
use Tie::Man::And::Man;
my $happy = tie $res106, Tie::Man::And::Man, $res107;
0112nobodyさん2006/06/02(金) 20:37:13ID:???
my $happy = tie $res106, Tie::Man::And::Man, $res107; # この状態ではシンボリック
$happy->insert(); # ここで実体化(ハード)
挿入する段階でハードリファレンスってどうやるの?
0113nobodyさん2006/06/02(金) 20:43:35ID:???
>>105 が聞きたかったのはこういう事かな? と ESP を発揮!

$test = \1; # リテラルスカラー値に対するハードリファレンス
print $$test; # デリファレンス

多分シンボリック=リテラルだと思ってるのかな と想像。

シンボリック=実体はただの文字列。文字列をデリファレンスするとシンボルテーブルから
         その名前を持つモノをひっぱってきてくれる。
0114nobodyさんNGNG
エスパーすげー
0115nobodyさん2006/06/02(金) 21:01:00ID:???
エスパースレいる?
0116nobodyさん2006/06/02(金) 21:46:32ID:???
リテラルとかハードリファレンスとかシンボリックとかわかんね〜!!!詳しく解説してるとこキボン
0117nobodyさん2006/06/02(金) 22:15:15ID:???
>>116
俺もよくわかんなくて、ガンガッってググったよ。
ここ↓とかどう? perl-解説ってとこ。

山口家の逆襲
http://kabocha.org/jelfe/

0118nobodyさん2006/06/02(金) 22:23:29ID:???
もうやめたw
0119nobodyさん2006/06/02(金) 22:38:40ID:???
wwwww
0120nobodyさん2006/06/02(金) 22:45:09ID:???
Perl歴1ヶ月とちょっとなんですけど、こんな理解であってますか?

●リテラル
コードに直接埋め込まれている値
・123 3.14 のような数値
・"abc" 'hoge' のような文字列
・(1, 2, 3) (hoge=>123, huge=>456) のようなリスト  など

●ハードリファレンス(ただ単にリファレンスと言った場合はこれ)
値に対する参照。これ自体もスカラー値。C言語やってた人はポインタと考えれば良い。
ハードリファレンスを生成するには、以下の方法がある。
・値や変数の前に「\」を付ける → その値に対してのリファレンス
・[1, 2, 3] → 無名の配列が自動的に作られて、その無名配列に対するリファレンス
・{hoge=>123, huge=>456} → 無名のハッシュに対するリファレンス
・sub { CODE } → 無名の関数に対するリファレンス(クロージャ)

●シンボリックリファレンス
ただの文字列。文字列をデリファレンスすると、パッケージが持つシンボルテーブル
(パッケージ変数の名前と実体を結び付ける表)を通じて、その文字列の名前を持つ
実体を得る事ができる。誤爆しやすいので use strict; すると使えない。
0121nobodyさん2006/06/03(土) 00:18:22ID:???
1ヶ月ならその理解で十分だよ。
0122nobodyさん2006/06/03(土) 02:04:02ID:???
俺は4年やってるがリファレンスなんてサッパリのクソ野郎だぜ
0123nobodyさん2006/06/03(土) 02:21:53ID:???
>>122
are u mr.kent?
0124nobodyさん2006/06/03(土) 18:24:46ID:???
ちょっと質問。

$" = '/';
@list = (10, 20, 30, 40, 50);
$scalar = "@list";
これで
$scalar = join( "/" , @list);
と同じ結果になるようだけど、「$" = '/';」を使った場合には、
特殊変数$"のデフォルトの値を変えてしまうから
その後もずっとjoinせずとも/で区切られた値になるという感じなのかな。

他にはサブルーチンの@_とかは元の値が変わっちゃうみたいだけど、
特殊変数の扱いはブロックの中だけ?それともブロックの中とか関係なし?
どちらの場合もある?

その辺は一時的なものなのか、恒久的(ちょっと変な表現だけどw)なのか教えて下され。
0125nobodyさん2006/06/03(土) 18:54:27ID:???
上はあってる。
ただし、mod_perl とか $" とかだとうまくできない場合があるね。

「特殊変数」 が 「$"」 とかを指すなら、
それの有効範囲はグローバル変数と一緒。
local $" とかもできるよ。
0126nobodyさん2006/06/03(土) 18:56:58ID:???
perl -e '@a=qw/a b c/; {local $"=q!/!; print "@a\n";} print "@a\n";'
perl -e '@a=qw/a b c/; {$"=q!/!; print "@a\n";} print "@a\n";'
0127nobodyさん2006/06/03(土) 20:34:18ID:???
個人的には「join」使っておけって思う
0128nobodyさんNGNG
$"は遅いよ
01291242006/06/03(土) 22:08:37ID:???
サンクス。
なんとなくイメージがつかめたよ。
0130nobodyさん2006/06/03(土) 23:16:29ID:???
localを使わなければ永久に変わる。
my にはグローバル変数およびパッケージ変数を宣言する能力がないので
ここにlocalとmyの大きな差がある。
呼び出し先のサブルーチンでの参照可能性でlocalとmyの差を説明するやつはウンコ
0131nobodyさん2006/06/04(日) 00:07:15ID:???
my→レキシカル変数の宣言
our→パッケージ変数の宣言
local→パッケージ変数のダイナミックスコープ化
という理解でおk?
0132nobodyさん2006/06/04(日) 00:46:14ID:???
our は C で言う static ?
0133nobodyさん2006/06/04(日) 01:08:44ID:???
ちゃうちゃう。
0134nobodyさん2006/06/04(日) 01:18:27ID:???
ちゃうのか・・・それなら覚えやすいな。 とか思ったのに (´ω`)
0135nobodyさん2006/06/04(日) 09:23:10ID:???
Javaのstaticに近くない?
0136nobodyさん2006/06/04(日) 10:40:42ID:???
CGI::Prettyを使って、ちょっと大きめのテーブルを表示し
ようとしたんです。
32文字ぐらい *16列 * 4098行 = 2M 程度。
メモリは2ギガ積んでいます。
しかし、実行するとメモリの使用率がガンガン上がって
いって止まってしまうんです。
use CGI::Pretty をコメントアウトすると問題ありません。
テーブルのサイズが小さいときは問題ありません。
なぜでしょう?
CGI::Pretty は使わないほうが速いというのはわかるんです
が、使わないと、HTMLソースがすごく見にくいので、できれ
ば使いたいんです。
CGI::Pretty って\tと\nを入れているだけにしか見えないの
ですが、そんなにメモリを使用するものなのでしょうか?
Windows,Linuxどちらでも、以下のスクリプトでも再現しました。
use strict;
use CGI qw(:standard);
use CGI::Pretty;
my @trs;
my @tds=qw(0 1 2 3 4 5 6 7 8 9 a b c d e f);
push @trs,td({bgcolor=>'#FFFFFF'}, \@tds) for (0..4097);
print header,start_html;
print table(Tr \@trs);

どこが問題なのでしょう?

ブラクラのつもりは無いのですが、
http://pc8.2ch.net/test/read.cgi/tech/1149259409/69
のようにswapし始めて、サーバが応答しなくなることがあるみたい
ですので、試すときは注意してください。
0137nobodyさん2006/06/04(日) 11:49:27ID:???
テーブルなら、

HTML::Table
ttp://homepage3.nifty.com/hippo2000/perltips/html/table.htm

があるけど、こちらを使ってみてはいかがでしょうか?
0138nobodyさん2006/06/04(日) 12:18:09ID:???
for (0..255);
で試した。
別 PC のブラウザで開いて、サーバーのメモリを監視してたら、ピークで 400MB 突破して、
250-350MB で変動してました。
で、500 Error で止まったw

Windows2000 + Perl 5.8.4 で試した。

自力で表示した方がいいんじゃないの?
0139nobodyさん2006/06/04(日) 12:24:48ID:???
for (0..128);
だと 143MB ピークで正常終了
0140nobodyさん2006/06/04(日) 12:46:25ID:???
たった256行表示するのに200メガ以上使ってエラー?
やっぱりモジュール使って書くメリットってのがわからない。
モジュール使ったほうがいいって言ってるヤツの意見を聞いてみたいね。
0141nobodyさん2006/06/04(日) 12:59:04ID:???
>>136
この程度のテキスト処理にそんなにメモリを使うはずがない。
と思って試したら本当にものすごい負荷がかかる。何なんだコレ?
0142nobodyさん2006/06/04(日) 13:13:35ID:???
ぃゃぃゃぃゃ、1つの悪で全てが悪と決め付けるのはいくないかと
0143nobodyさん2006/06/04(日) 14:07:00ID:???
>>136
@CGI::Pretty::AS_IS = grep !/^td$/, @CGI::Pretty::AS_IS;

これを use CGI::Pretty; の後に差し挟むことで耐用限界を引き上げることができるはず。
アドホックでバッドプラクティス全開なので、あくまで応急処置。

こういうの思いついちゃう自分が嫌い。
0144nobodyさん2006/06/04(日) 15:43:10ID:???
Win32::OLEを使って以下のようにExcelのセルのデータを取り出しています。
その場合、元の値が「2004/7/7」という中央寄せの文字列(日付型ではない)のとき、取り出した値が
Win32::OLE::Variant=SCALAR(0x1c14028)
となってしまうのですが、何が原因なのでしょうか。

use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';

my $master_excel_file = "xlsファイル";

$Win32::OLE::Warn = 3;
my $Excel = Win32::OLE->GetActiveObject('Excel.Application')
|| Win32::OLE->new('Excel.Application', 'Quit') || die;
my $Book = $Excel->Workbooks->Open($master_excel_file) or die;

foreach my $row(@{$Book->Worksheets(1)->Range(A1:Z1000)->{'Value'}}) {
my @values = @$row;
}
0145nobodyさん2006/06/04(日) 17:00:56ID:???
CGI::Pretty って標準モジュールなのなw
256程度でエラーとか、全然かわいくねーよw
■ このスレッドは過去ログ倉庫に格納されています