Perlコーディング初心者質問スレ Part 50
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/06/26(月) 00:46:38ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0456nobodyさん
2006/07/12(水) 21:10:09ID:???>>454
そw 普段こんなの絶対使わないw
が、たまに
my $i = 0;
my %hash = map { $_ or $i ++ } split /(.{20})/, $hoge ;
とかしたくなって誘惑される。
だからダークサイド。
0457nobodyさん
2006/07/12(水) 21:24:50ID:???>探す文字がパターンマッチを必要としないならindexの方が激速。
なるほど…今度使ってみよう。
>>456
それって20で割り切れなかったら…
まあ、承知のうえで書いてんでしょうけど。ダークサイド宣言してるし。
0458nobodyさん
2006/07/12(水) 21:26:14ID:Fw7S49xFperlで書かれたあるcgiからhtmlを読んでその中身を表示したいのですが、さらに一歩踏み込んで、そのhtmlの中でさらにperlで書かれたcgiを呼んで、そのhtmlを動的に変更して表示したいのですが、そんなこと可能ですか?
0459すいません…
2006/07/12(水) 21:50:43ID:???ダウンロードしたのですが、コマンドプロンプトでバージョンチェックを
しても、「バッチファイルとして認識していません」と表示されるのですが
どうすれば良いのでしょうか?
0460nobodyさん
2006/07/12(水) 21:51:10ID:???一応対応はできる、がこんなことするくらいだったら
普通に hash 作成すべき。
split /(.{20})/, $hoge ;
push @_, '', pop @_ if @_ % 20 != 0 ;
my $i = 0;
my %hash = map { $_ or $i ++ } @_ ;
0461460
2006/07/12(水) 21:59:24ID:???orz...吊ってくる
0462460
2006/07/12(水) 22:03:56ID:???スレ汚しすまん
0463nobodyさん
2006/07/12(水) 22:36:08ID:???Perlでシェルスクリプト(useradd)を使用するにはどうしたらいいでしょうか?
0465nobodyさん
2006/07/12(水) 23:03:43ID:l/BVmrr1これってPerlユーザーの主流じゃないようなんですが
何故ですか
0466nobodyさん
2006/07/12(水) 23:08:41ID:???system "your script" ;
もしくは your script をバッククォートにてかこむ。
your script 部分にはコマンド単独実行時の
打ち込むものすべてを入れる。
0467nobodyさん
2006/07/12(水) 23:18:33ID:???#!/usr/bin/perl
$user = "aaa";
system "useradd $user";
エラーは出ないのですが、ユーザーが追加されてません。
なぜでしょうか?
0468nobodyさん
2006/07/12(水) 23:30:16ID:???具具ってみたけど
useradd って管理者権限が必要でしょ。
sudo useradd か perl 自体の実行を su でするか
しないとだめなんじゃない?
力になれそうにありません。すまん。
0470446
2006/07/12(水) 23:41:57ID:???>>453
> 視覚的にとかいう意味だと、スライスの方が数字なんだし読みやすい希ガス。
もちろんそりゃ読みやすいほうを使ったらよろしいんです。いつでもどちらかがイイってな話はしてないですから。
「視覚的に」と言うからには、数値のリストを添字として読み、それを元にスライスされる前のリストからどの値を取り出してどの値を捨てたのかを、脳内変換すること無しに、その姿を *目で見て* 把握できることを指しています。
逆から言えば、その意味では添字によるスライスの表現は、左辺 undef と比較した場合、視覚的ではないと言わざるを得ないでしょう、ということです。
0471nobodyさん
2006/07/12(水) 23:43:05ID:3OAigznjCGI経由でsql文を実行しようとすると動きません
コンソールからやっても動かないのでsql文がおかしいと思います。
mysql> update todo set content = aho where id = 9;
ERROR 1054 (42S22): Unknown column 'aho' in 'field list'
以上のエラーが出ています。
mysqlのバージョンは4.1.13です。
よろしくお願いいたします。
0472nobodyさん
2006/07/12(水) 23:44:44ID:???それじゃ同じ答えしか返ってこない。
system使えとか、``使えとか、qx() しろとか。
systemの戻り値を調べるか、$! を見て。
0473nobodyさん
2006/07/12(水) 23:46:15ID:3OAigznj本当にありがとうございました。
0474nobodyさん
2006/07/12(水) 23:53:16ID:???>ちょっと質問変えてみます
>Perlでシェルスクリプト実行するにはどうしたらいいでしょうか?
まあ、同じ答えになるんだけどもちょっとだけ詳しく。
「/PATH/hoge.sh を引数 piyo つきで実行するなら」
system "sh /PATH/hoge.sh piyo" ;
「STDOUT を perl の変数に直接入れたいなら」
open EXE, "sh /PATH/hoge.sh piyo|" ;
@data = <EXE> ;
「STDERR とか細かなところまで制御したいなら」
perldoc IPC::Open3あたり
0476nobodyさん
2006/07/13(木) 00:23:07ID:???Perl は UNIX 上の仕事をやっつけるために生まれ、UNIX 系のシステムを中心に普及したから。
でも主流じゃないことを気に病むことはないよ。まずは悩む代わりに、その時間を使ってコードを書くんだ。
0477nobodyさん
2006/07/13(木) 00:26:45ID:???`
0478nobodyさん
2006/07/13(木) 00:32:23ID:???>探す文字がパターンマッチを必要としないならindexの方が激速。
あんま誤解の生じること言わないほうがいいw
0479nobodyさん
2006/07/13(木) 00:38:17ID:???一般に正しいと思うけど。
(最適化のかかる)オートマトン作らなくて良いパターンでなければ、
indexの方が遥かに安価で速いだろう。
0480469
2006/07/13(木) 00:39:17ID:???0482nobodyさん
2006/07/13(木) 00:48:22ID:???0483nobodyさん
2006/07/13(木) 00:48:54ID:???正しくないw
ベンチとってみればわかるけど
A1 $_ =~ /hoge/
A2 index($_, 'hoge')
my $word = 'hoge';
B1 $_ =~ /$word/
B2 index($_, $word)
A1 A2 はほぼ同じ速さで、
B1 は B2 より速い。
index($_, $word[1]) or index($_, $word[1]) ・・・
より
/$word[0]/ or $word[1] ・・・
のが速い。
$_ が 'aaaaaaa......' で $word が 'baaaaaaaaaaaa' とかいう特殊な場合は考えないでね。
0484469
2006/07/13(木) 00:48:56ID:???0485nobodyさん
2006/07/13(木) 00:50:07ID:???× /$word[0]/ or $word[1] ・・・
○ /$word[0]/ or /$word[1]/ ・・・
0486nobodyさん
2006/07/13(木) 00:50:10ID:???日本語の問題だと思うけど。
「探す文字がパターンマッチを必要としないなら(最適化がかかるので)indexの方が激速なんてことはない。」
0487458
2006/07/13(木) 00:52:59ID:aY2uz4D9レスありがとうございます。
もう少し具体的に質問します。
まずparent.cgiがあります。ここやってることはhtmlテンプレートを使ったchild.htmlファイルを読み込んで表示させるだけです。つまり
$template = HTML::TEMPLATE->new(
filename => 'child.html',
);
print $template->output;
のような感じです。
このchild.htmlでは
<!-- TMPL_INCLUDE NAME="hoge.html" -->
のようにhtmlファイルを読み込んでいます。
しかし今回このhoge.htmlの代わりにhoge.cgiを使いたいのです。つまり静的なhtmlファイルではなくcgiを使ってここに表示される内容を動的に変化させたいわけです。これをするのにいい方法ありますでしょうか?
0488nobodyさん
2006/07/13(木) 01:04:37ID:???静的なhtmlをincludeするんじゃなくて、そこで普通にテンプレートを使えば
実質お望みの事ができると思うんだけど…。
0489nobodyさん
2006/07/13(木) 01:05:37ID:???いろいろ方法はあるだろうけど、全く別の CGI を呼ぶ 「いい方法」 というなら SSI が 「いい方法」 だと思うぞ。
0490nobodyさん
2006/07/13(木) 01:06:25ID:???0491nobodyさん
2006/07/13(木) 01:17:32ID:???パーミッション777のディレクトリだとmkdirできるのですが
755だとできません。777だとセキュリティ的に問題ですよね?
755のディレクトリ直下に新規ディレクトリを作成するにはどうしたらいいでしょうか?
0495487
2006/07/13(木) 02:29:43ID:aY2uz4D9知識不足で申し訳ないです。普通にテンプレートを使うとはどういうことでしょう?テンプレートでcgiを実行するようなものがあるんですか?
>> 489
SSIで試してみました。parent.cgiから読み取るのをchild.shtmlにしてその中で<!--#exec cmd="perl hoge.cgi" -->として実行してみました。
結果普通にchild.shtmlを見ると実行が確認できたのですが、parent.cgiの中でshtmlを読み込んでしまうとSSIが実行されないようでダメでした。
>>490
カウンターではありませんw
0496nobodyさん
2006/07/13(木) 02:50:05ID:???テンプレート使ってるってことは、そもそもCGIで動いてるんでしょ。
その場で動的なページ作ればいいだけでは。
テンプレートで静的なhtmlを読み込んで、
さらにそこからCGI叩いて動的なページを、、、なんて考える前に。
0497495
2006/07/13(木) 03:13:47ID:aY2uz4D9レスありがとうございます。
しかしそのテンプレートのhtmlの"ある部分"にCGIの結果を入れたいんですよ。そこはスタイルシート等で位置が厳密に決まっているのでその部分だけ元のparent.cgiでhoge.cgiを呼び出してってのは難しいんじゃないかと思ってます。
0498nobodyさん
2006/07/13(木) 03:25:44ID:???0499nobodyさん
2006/07/13(木) 06:06:02ID:???言いたい事はわかるが、
それはパターンマッチを必要とする条件じゃないのか?
ただの文字列を探すならindexしかないだろ。
0500nobodyさん
2006/07/13(木) 06:14:58ID:???皮をかぶってるかもしれないから、ソース見るかベンチ取るかしてみないと(ry
0501nobodyさん
NGNGふつーに簡単なベンチ取ったら
indexの方が2倍 速かったんですけど
当然っちゃー当然の結果やね
0502nobodyさん
2006/07/13(木) 06:32:39ID:???http://x68000.q-e-d.net/~68user/webcgi/search-1.html
0503457
2006/07/13(木) 07:33:25ID:???>>502
横レスだけどリンク先を良くよんだら?
search-2.cgi がせめて and 検索だったらいいんだけどリンク先は
アンフェアな比較だよ。(まあ、そういう目的で作ったんんじゃない
だろうけど)
以下は寝起きで確認したベンチマークのソース。
#!/usr/bin/env perl -w
#use strict ;
use Benchmark ;
my $str1 = ( 'a' x 30 ) . 'hoge' . ( 'a' x 10 ) ;
my $str2 = ( 'a' x 30 ) . ' hoge ' . ( 'a' x 10 ) ;
sub cont1(){ $str1 =~ /hoge/ }
sub cont2(){ $str2 =~ /hoge/ }
sub test_index1(){ index $str1, 'hoge' }
sub test_index2(){ index $str2, 'hoge' }
timethese 500000, { o0 => 'cont1' , o1 => 'cont2' , o2 => 'test_index1' , o3 => 'test_index2' } ;
================
Benchmark: timing 500000 iterations of o0, o1, o2, o3...
o0: 1 wallclock secs ( 1.66 usr + 0.01 sys = 1.67 CPU) @ 299401.20/s (n=500000)
o1: 2 wallclock secs ( 1.66 usr + 0.02 sys = 1.68 CPU) @ 297619.05/s (n=500000)
o2: 1 wallclock secs ( 1.43 usr + 0.01 sys = 1.44 CPU) @ 347222.22/s (n=500000)
o3: 1 wallclock secs ( 1.43 usr + 0.01 sys = 1.44 CPU) @ 347222.22/s (n=500000)
0504nobodyさん
2006/07/13(木) 07:46:36ID:???search-2 が and 検索であろうとなんであろうと、単純な index と正規表現
の速度比較のソースにはならんな。
0505nobodyさん
2006/07/13(木) 13:17:19ID:???>Perlはもしかしたらindexが正規表現ライブラリの
>皮をかぶってるかもしれないから
それは普通に考えてありえない…。
0507nobodyさん
2006/07/13(木) 16:04:15ID:???>>503 と同じようなのを書いてベンチ取った。
何度かやってみたが、変数に入れてもindexの方が速かった。
#!/usr/bin/perl
use Benchmark;
my $str1 = ('a' x 30) . 'hoge' . ('a' x 10);
my $str2 = ('a' x 30) . ' hoge ' . ('a' x 10);
sub test_reg1 { my $hoge = 'hoge'; $str1 =~ /$hoge/; }
sub test_reg2 { my $hoge = 'hoge'; $str2 =~ /$hoge/; }
sub test_index1 { my $hoge = 'hoge'; index($str1, $hoge); }
sub test_index2 { my $hoge = 'hoge'; index($str2, $hoge); }
timethese 500000, {
reg1 => 'test_reg1',
reg2 => 'test_reg2',
idx1 => 'test_index1',
idx2 => 'test_index2',
};
idx1: 1 wallclock secs ( 0.83 usr + 0.00 sys = 0.83 CPU) @ 602409.64/s (n=500000)
idx2: 0 wallclock secs ( 0.83 usr + 0.00 sys = 0.83 CPU) @ 602409.64/s (n=500000)
reg1: 1 wallclock secs ( 1.00 usr + 0.00 sys = 1.00 CPU) @ 500000.00/s (n=500000)
reg2: 0 wallclock secs ( 1.00 usr + 0.00 sys = 1.00 CPU) @ 500000.00/s (n=500000)
0509nobodyさん
2006/07/13(木) 16:38:50ID:???あー、ほんとだ。
でもね、検索対象のサイズを大きくするにしたがって逆転していくみたい。
my $str1 = ('a' x 10000) . 'hoge' . ('a' x 1000);
my $str2 = ('a' x 10000) . 'hage' . ('a' x 1000);
とかでやってみておくれ。 これは 11k だけど、うちの環境では 1k あたりから差がではじめた。
0511nobodyさん
2006/07/13(木) 17:29:16ID:???気になる人はよく考えるなり実験するなりして選択しろと
いうことか。
0512nobodyさん
2006/07/13(木) 17:33:49ID:???(オートマトン作らなくて良い)なんて事は無いし。
0513nobodyさん
2006/07/13(木) 19:41:52ID:???0515nobodyさん
2006/07/13(木) 20:09:12ID:IeuSyhG10516nobodyさん
2006/07/13(木) 20:52:55ID:???0517nobodyさん
2006/07/13(木) 21:53:37ID:???0518nobodyさん
2006/07/13(木) 21:58:11ID:???「それでもPerlは動いている」
0519nobodyさん
2006/07/13(木) 22:11:56ID:Ms2xB21uアクセス解析用のcgiで出力を上記のようにしています。
自分自身先日winXPのIE7のベータ版にブラウザを変えて、気付いたのですが、
キャッシュされてしまってページ間の移動時に思うように動作しないことがあります。
これはベータ版のバグかもしれませんが。普通はcgiファイルをキャッシュして読み込みを省略することはないと思うので。
それでキャッシュ対策のヘッダを付け加えたいのですが、
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="Tue, 20 Aug 1996 14:25:27 GMT">
これのPERLヘッダ?版はどう記述すればいいでしょうか?
宜しくお願いします。
0520nobodyさん
2006/07/13(木) 22:22:32ID:Ms2xB21uprint "Cache-Control: no-cache\n";
print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n\n";
一応こんな感じかなと思いますが、あってるのでしょうか?
http://www.gac.jp/article/index.php?stats=question&category=10&id=11811&command=msg
ここではどうやらNNにはこれでは残ってしまうように書いてあるのですが。
0522519
2006/07/13(木) 22:24:37ID:Ms2xB21u要は私の場合は戻るボタンが効かないように、ではなくて、
アクセス解析CGIがちゃんと動作することと、
チャットで使ってる、
<meta http-equiv="Refresh" content="15">
がちゃんと動作することなのですが。
0523519
2006/07/13(木) 22:25:35ID:Ms2xB21uありがとうございます。
その書き方がイマイチ自身がもてなかったので投稿して確認に参りました。
0524nobodyさん
2006/07/13(木) 22:26:24ID:???0525nobodyさん
2006/07/13(木) 23:13:19ID:???というエラーが出たんですが、これはどういうときに出るもんなんですか?
test.cgiの60行目で''と''が同じになってるよ(コピーされたとかじゃなくてな)
ってこと?意味が分かりません。
0526525
2006/07/13(木) 23:16:07ID:???59行目}elsif($action eq 'move'){
60行目&move;
61行目&move_complete;
62行目}elsif(......
0529nobodyさん
2006/07/14(金) 00:05:57ID:???この「temp」フォルダの中にある各フォルダの名前を$dirnameとしましょう。
各フォルダの中に、
{
$dirname
}
とだけ書かれた、「test.txt」という名前のファイルをそれぞれ新しく作りたいんです。
#!/usr/bin/perl
opendir DIR, "temp" or die "can't open temp\n";
@dir = map { -d "temp/$_" ? $_ : '' } readdir DIR;
foreach $dirname (@dir) {
chdir "./$dirname";
open OUT, ">test.txt" or die "can't create the file\n";
print OUT "{\n";
print OUT "$dirname\n";
print OUT "}\n";
close OUT;
chdir "..";
}
close DIR;
こんな感じにプログラムを書いてDOSプロンプトから実行したのですが何も起きません・・・
どうすればいいのか教えていただけないでしょうか?
0530525
2006/07/14(金) 00:20:17ID:???&move;を別の名前に変える動いた・・・なぜ??
逆に59行目の'move'を別の名前に変えただけでは同じエラーが。
0531nobodyさん
2006/07/14(金) 00:26:19ID:???とりあえず、mapで書いてる行をgrepで書き直す。
@dir = grep { -d "temp/$_" && !/^¥./ } readdir(DIR);
0533nobodyさん
2006/07/14(金) 01:07:41ID:???print @dir ; か
chdir "./$dirname" or die してみそ
@dir の中身は
./temp/hoge
./temp/piyo
じゃなく
hoge
piyo
になるYO @OSX
0534nobodyさん
2006/07/14(金) 01:11:29ID:???foreachの前の時点で@dirに期待した値が入ってるかどうかぐらいは
確認して問題の切り分けをしろよ。
あとchdirも失敗することがあるので or dieしとけ。
0535nobodyさん
2006/07/14(金) 01:13:56ID:???誰かがなんか書いたらそれコピペして動くかどうかだけ?
なんだかなぁ。
0536nobodyさん
2006/07/14(金) 01:14:40ID:???open OUT, "> temp/$dirname/test.txt" or die "can't create the file\n";
ってすればいいじゃない
0537nobodyさん
2006/07/14(金) 01:21:07ID:???0538529
2006/07/14(金) 01:27:17ID:???できました!!!
ものすごく賢いやり方ですね。
>>534、>>533
chdirがうまくいってなかったというか、どうやら相対ディレクトリ名の指定とかが根本的
にわかっていなかったようです。openでカレントディレクトリも変わるんだと思ってました。
>>535
(・∀・)
みなさんどうもありがとうございます。
おかげさまで相対ディレクトリ名の指定ということに関してだいぶ理解が進みました。
0539nobodyさん
2006/07/14(金) 02:04:03ID:???そもそも1回目の
chdir "./$dirname";
でもし成功して temp/hoge/ になっちゃった場合、2回目はそこから chdir だから temp/hoge/fuga/ とかなんじゃねの?
0540nobodyさん
2006/07/14(金) 02:23:45ID:???フルパスも相対パスも知らずにファイル扱ってたのか((( ;゚Д゚)))
0541nobodyさん
2006/07/14(金) 02:33:40ID:???>>529 のコードではファイルへの書き込みを行なった後に chdir ".." してるから
temp/ → temp/hoge/ → temp/ と戻るはず。
でもやっぱり読みづらいから、カレントディレクトリはあんまり変えて欲しくないなぁ。
0542nobodyさん
2006/07/14(金) 16:30:45ID:???前提条件でそういうのはないならOKだが一般的にはchdir ".."では
戻れないかもしれない。
perlのchdirにはファイルハンドルやディレクトリハンドルを渡せるので、
戻りたいディレクトリを開いておいてこっちを使うほうが安全。
0543nobodyさん
2006/07/14(金) 18:02:15ID:IyAZlhFkqmailなのですが、perlにパイプさせるにはどうしたらよいでしょうか?
sendmailなら/etc/aliases でできますよね?
0545nobodyさん
2006/07/14(金) 19:43:53ID:???上記の掲示板に投稿する際のコード入力のスクリプトを作ったんですが
時たまコード入力より下が表示されなくなってしまいます。
どうすれば改善していいか分かりません。
どなたか改善よろしくお願いします。
0546nobodyさん
2006/07/14(金) 19:50:38ID:???<form>タグが無い。
<table>タグも無い。
下から5行目、==&gt;と書くべき所で、'==>' と書いている。
0547nobodyさん
2006/07/14(金) 19:55:39ID:???というか、sub code 自体をどこからも呼んでない…。
sub error は存在しない。
何がしたいの?そこからして不明。
0548nobodyさん
2006/07/14(金) 19:59:34ID:???削除パスワードの下に&code;で呼び出して使ってます。
sub errorはあります。
で何をしたいかと言うとどうやってもコード部分が原因だと分かっていてもたまにコード部分からしたが消える
のが直せないので直してほしいわけです。
0549nobodyさん
2006/07/14(金) 20:04:26ID:???0550nobodyさん
2006/07/14(金) 20:05:56ID:???そんな一部しかないんじゃ分からん…。
とりあえず、>>546 の通り&code の中でHTML表示してる部分、
tableタグの開始も終了も無いんだが…。そこが一番あやしい。
ちゃんとtableタグ入れてみたら?
それさえ分からなければ、PerlじゃなくてHTMLの質問だよ。
0551nobodyさん
2006/07/14(金) 20:08:03ID:???http://livetool.ty.land.to/aska/aska.cgi
ココに問題の掲示板とソースをのっけてあります。
数回更新ボタンを押していると表示されなくなりますのでそれを改善したいのです。
よろしくお願いします。
0552nobodyさん
2006/07/14(金) 22:04:47ID:LnOAoBN3よい参考書を教えてください
0554nobodyさん
2006/07/14(金) 22:26:32ID:cNzjTfEoその程度は参考書などいらない。
というか基本的にプログラム組むのに参考書なんていらない。
http://www.rfs.jp/sb/index.html
ここに書いてある内容を全て理解・・しなくても簡単にそのくらいは作れる。
まずは自分のパソコンに仮想環境を作ることが先決だ。
そうすればどれだけ程度の低い話なのかわかる。
優れたプログラムを組めるかどうかは人によって優劣がでるが、
最低限動くものなら健常者であれば誰でも可能。
■ このスレッドは過去ログ倉庫に格納されています