Perlコーディング初心者質問スレ Part 61
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2010/06/05(土) 21:11:10ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1251989472/
0619nobodyさん
2010/10/23(土) 10:00:59ID:???0620nobodyさん
2010/10/23(土) 12:42:59ID:???いろんな言語で宿題 第五編
http://hibari.2ch.net/test/read.cgi/tech/1276873238/
0623Perl忍者 ◆M5ZWRnXOj6
2010/10/23(土) 16:46:29ID:21A5e2350624nobodyさん
2010/10/23(土) 17:52:56ID:???自前でデータ保存読み込みのコードを書くより楽だから
0625nobodyさん
2010/10/23(土) 19:48:57ID:???DB はシステムが逝くと使い物にならない。
こうゆう部分で二の足踏んでる。
0626nobodyさん
2010/10/23(土) 20:01:46ID:???0627nobodyさん
2010/10/23(土) 20:52:18ID:???0628nobodyさん
2010/10/23(土) 22:49:15ID:???0629nobodyさん
2010/10/23(土) 23:32:08ID:???ありがとうございます。本当にわからなくて困っていたのでお願いします。
問題:関数のfactorial、area_circle、wrapitを使って出力が得られるよう
主モジュールを作成せよ。(関数と一体になった完全なプログラム)
(テキストp03176.plの青春の詩YOUTHを用いる)
0630nobodyさん
2010/10/23(土) 23:33:10ID:???#getsrc x 176
use strict;
my %count;
my $size = 4; # カウントする単語の最小サイズ
while( <DATA> )
{
my @words = split;
foreach my $word ( @words )
{
next if length($word) < $size;
$count{$word}++ if $word =~ m/^[a-zA-Z]+([-'][a-zA-Z]+)*$/;
}
}
my $uniq_words = keys %count;
unless ($uniq_words)
{
print "ファイルには単語がありません。\n";
exit;
}
my $total_count = 0;
my $total_length = 0;
foreach my $word ( keys %count )
{
$total_count += $count{$word};
$total_length += length($word);
}
my $avg_length = $total_length/$total_count;
print <<STATUS;
$size文字以上の長さの単語の出現状況
------------------------------------------
0631nobodyさん
2010/10/23(土) 23:34:34ID:???単語の種類 = $uniq_words
平均の単語長 = $avg_length
STATUS
__DATA__
YOUTH
Youth is not a time of life - it is a state of mind, it is
a temper of the will, a quality of imagination, a vigor of
the emotions, a predominance of courage over timidity, of
the appetite for adventure over love of ease.
Nobody grows old only by merely living number of years;
people grow old only by deserting their ideals.
You are as young as your faith, as old as doubt; as young
as your selfconfidence, as old as your fear; as young as your
hope, as old as your despair.
0633nobodyさん
2010/10/25(月) 20:02:17ID:???検索エンジンも使えないの?
その問題は具体的にfactorial、area_circle、wrapitがどういうルーチンなのかわからないと解けないんだよ。
factorial、area_circle、wrapitがどういうルーチンかはわかっているんでしょ?
だったらそれを書いた後に、名前から勝手に想像するが、
print factorial(5);
とかやってみればいいじゃない。
0634nobodyさん
2010/10/26(火) 23:13:25ID:???$filepath = "c:/folder";
$filename = "excelfile";
$xlspath = "${filepath}/${filename}.xls";
略
print $xlspath;
$wb->SaveAs($xlspath);
printの時点ではちゃんと拡張子も含まれた完全なパスなのですが
OLE32 LastErrorを取ってやるとSaveAsのところでC:\//folder/excelfile というパスが見つからないというエラーが出ているようです
SaveAsの引数に直接ファイル名まで入れた絶対パスのリテラルを書くとちゃんとxlsファイルが出力されるので単に渡される文字列が正しくないことが原因だと思うのですが・・・
どのように修正すればよいのかご教授ください、よろしくお願いします
0635nobodyさん
2010/10/28(木) 22:26:44ID:???my $param = $in->param('abc');
abc が渡されてなければ、param の結果は undef でいいんですよね?
0636Perl忍者 ◆M5ZWRnXOj6
2010/10/28(木) 22:28:11ID:oSh7LqBC老人? 確認するための老人?
0637nobodyさん
2010/11/04(木) 14:47:19ID:8SyFnluahoehoeとは,[ 1 ]上の[ 2 ]の[ 3 ]となることができる[ 4 ]をいう。
hoehoeは,[ 5 ]時に取得する。
hoehoe,[ 6 ]よって[ 7 ]する。
-----------------------------------------------------------------
ここから[]に含まれた1から7までの数字を全部抽出したくて、
open( DATA, "C:\teigi.txt" );
while(<DATA>){
if(/\[\s(\d+?)\s\]/g){
print "$1\n";
}
}
とやってみたのですが、
1
5
6
のように各行で最初にマッチした数字しか取り出せません。
どのように修正したらいいか教えてください。お願いします。
0638nobodyさん
2010/11/04(木) 15:01:07ID:???0640nobodyさん
2010/11/04(木) 15:13:30ID:???my $text;
read(IN, $text, (-s IN));
close(IN);
my @data = $text =~ /\[ (\d+?) \]/gs;
print join("\n", @data);
exit;
0642nobodyさん
2010/11/05(金) 21:30:27ID:???$cfg->param(-block=>'hoge', -values=>{'time'=>time()});
とするとブロックを追加でき、
$cfg->param(-block=>'hogel');
でブロックにアクセスできます。
が、
$cfg->delete(-block=>'mysql');
としてもブロックを削除できません。
ブロックごと削除するにはどう記述したらよいですか?
0643nobodyさん
2010/11/06(土) 10:03:24ID:???delete メソッドを拡張するといいよ。
0644nobodyさん
2010/11/06(土) 10:05:34ID:???delete $cfg->{_DATA}->{mysql};
とやれば消えるか。
0645nobodyさん
2010/11/08(月) 00:17:08ID:???あまりにもマイナーな形式のため、標準のモジュールでは対応してないみたいです。
ただAPIを使用すれば解凍できそうなので、下記のURL(C言語?)を参考にPerlでAPIを組むことにしました。
ttp://tokovalue.web.infoseek.co.jp/LZOpenFile_U.htm
----------------------------------------------------------------------------------------
use Win32::API;
my $kaitou = new Win32::API("lz32", "LZOpenFile", ["P,P,N"], "N")
----------------------------------------------------------------------------------------
しかしAPIの宣言はできたのですが、下記の構造体の部分をPerlで書く方法がわかりません…
Type OFSTRUCT
cBytes As byte
fFixedDisk As byte
nErrCode As Integer
Reserved1 As Integer
Reserved2 As Integer
szPathName As String * 128
End Type
調べたらpack、unpackを使えば構造体を使用できるらしいのですが、例等がないため見当もつかないです。
もしどなたか分かる方がいれば教えて頂いてもよろしいでしょうか?
お願い致します。
0647nobodyさん
2010/11/08(月) 18:53:06ID:u2tFSMiGEncode::JP::H2Z
Lingua::JA::Regular::Unicode
Unicode::Japanese
何が主流なんでしょうか?
CentOS5.5 perl v5.8.8
0648nobodyさん
2010/11/09(火) 04:15:52ID:???微妙に機能が違った気がするけど覚えてない
俺はLingua::~~
を使ってる
0649nobodyさん
2010/11/10(水) 16:07:10ID:???具体的にはクエリが空っぽなら入力フォームを表示。
表示した入力フォームから入力があればクエリのデータを読み取って出力をするプログラムが走るようにしたい。
空を判定するのにunless( !defined( $a )こうやって見たけどどうやら空でも0でもない何かが入ってるらしくバグる。
0650nobodyさん
2010/11/10(水) 16:11:20ID:???0651nobodyさん
2010/11/10(水) 16:19:32ID:???0652nobodyさん
2010/11/10(水) 16:39:06ID:???フォームを強制的に表示して次に空で送信すると以下のようにURLに何かくっ付きます
ttp://xxxxxx.jp/idsaves.cgi?t1=&t2=&t3=&t4=
このときは値は空のようです
フォームを表示せずに普通にCGIを呼び出したアドレスはこれです。
ttp://xxxxxx.jp/idsaves.cgi?
このときの値は0のようです
0でもない空でもない幻はこの2パターンに対したまたま組んだプログラムが上の時は0を想定して
下のときは空を想定したプログラムでたまたまテストして両方エラーだった為0でも空白でもないと思い込んだようです。
0653nobodyさん
2010/11/10(水) 17:04:29ID:???$a $bは使うなとなんべん言ったら…
それと今回はそれ以前の話だったようだけど、
本来空文字かどうか判断するなら ne を使うべきで defined は使うべきでない
# 文字があるとき true を表示したい
$str = '';
defined $str ? print "true\n" : print "false\n"; #=> true
$str ne '' ? print "true\n" : print "false\n"; #=> false
0654nobodyさん
2010/11/10(水) 19:03:35ID:???なにかコードがPerlとは違うように見えるのですが。
省略か何かの書き方の違いですか?
それとどこかで拾ってきたサンプルソースがdefinedではなく!definedなってて
それでバグったみたいです!definedは単なるミス表記なのか何か意味があるのか教えてください。
0656nobodyさん
2010/11/10(水) 19:40:50ID:???今時のMVCモデルに逆行している…。
unless (!defined(**)) は、 if (defined(**) と同じ。
$aと$bはsortに使われる特殊な変数なので、それ以外の用途には使わないのがお約束です。
素直にCGI.pmを使ってはいかがでしょうか。
use CGI;
my $q = new CGI;
だったとして、
htmlの中に、<input name="flag" value="1" />などと仕込んでおいて、$q->param("flag")の真偽で判定するとか。
0657nobodyさん
2010/11/10(水) 20:11:56ID:???関係ないけど、このほうが気分的にすっきりしてて好き
0658nobodyさん
2010/11/10(水) 23:45:12ID:???0659nobodyさん
2010/11/11(木) 00:17:16ID:???ってやりたくなっちゃうw
0660nobodyさん
2010/11/11(木) 00:28:20ID:???でもフレームワークって人によるコーディングの揺らぎを制限するもんじゃないっすか?
矛盾してるよね。
開発者の意図を汲むなら、Perl にフレームワークって必要無いんじゃね?
って思えてきた木曜日の深夜。
0661nobodyさん
2010/11/11(木) 06:31:03ID:9cAwBIieフレームワークの選択肢はあるし、自分でも作れるから矛盾はしてないんじゃない?
0663nobodyさん
2010/11/15(月) 22:57:52ID:rKCqUAELhttpd.confや.htaccessの設定で認証を行うと、セキュリティは高いのですが、ログアウトができません。
そこでクッキーとスクリプトで認証(パスワードからハッシュを求めてパスワードファイルと比較)しようとしたのですが、
Apacheの認証(httpd.confや.htaccess)と併用すると、スクリプトで認証した後でApacheが認証要求を
出して二回ログインする必要がありそうです。
何か良い方法はないでしょうか?
0664nobodyさん
2010/11/15(月) 23:23:53ID:???0665nobodyさん
2010/11/15(月) 23:25:21ID:???0666663
2010/11/15(月) 23:28:15ID:???0667nobodyさん
2010/11/15(月) 23:32:59ID:???0668663
2010/11/15(月) 23:48:34ID:rKCqUAEL0669663
2010/11/16(火) 00:01:48ID:???△▲ WebProg 初心者の質問 Part22 ▼▽
http://hibari.2ch.net/test/read.cgi/php/1272872528/
0670nobodyさん
2010/11/16(火) 03:25:31ID:???Webページ内の任意のタグ内のテキストを全て取得する方法を探しています
以下のような処理です
<div class="hoge" id="moge">
<a href="hage">TEST</a>
</div>
↑Webページ内から上記のような部分を探し出し、div、hoge、mogeといったパラメータを指定して
↓以下を出力する
<a href="hage">TEST1</a>
対象ページを全取得し、改行やタブを消去して正規表現で…と最初は考えていたのですが、
もっとスマートな方法があれば知りたいです
参考になるサイトなどありましたら教えて下さい
0671670
2010/11/16(火) 03:29:36ID:???抽出対象は「入れ子」になっていない事が前提です
つまり以下のような存在は考慮する必要はありません
<div class="hoge" id="moge">
<div class="hoge" id="moge"><a href="hage">TEST</a></div>
</div>
0673nobodyさん
2010/11/16(火) 05:48:42ID:MILxW7l40674670
2010/11/16(火) 06:45:19ID:???ありがとうございます
Web::Scraperで簡易なテストプログラムが動作する所まで進みましたが、
今の所HTMLタグを全て除去した素のテキストしか取得してくれません
>>670で言えば「TEST」しか表示されない状態です
もう少し調べてみます
0675670
2010/11/16(火) 07:32:25ID:???process "mage", "hige" =>"TEXT";
を
process "mage", "hige" =>"HTML";
に変更してうまくいったようです
0676nobodyさん
2010/11/17(水) 12:19:54ID:???以下のように、定義だけモジュール化しています。
use My::Module;
my $mod = My::Module->new();
my $dbh = $mod->ret_DBI;
同様に、Text::XslateをMy::Moduleに書いて
my $tx = $mod->ret_Xslate;という風に使おうと思ったのですが、
mod_perl環境下では、正しく定義されないようなのです。
(My::Module中でpath => '/var/www/html/myapp/template' としているのに、
/var/www/htmlにそんなテンプレはねぇ!と怒られます。)
何か回避策はないものでしょうか?
また、Tiantモードでも怒られまくるのですが、
「Tiantモードでテンプレートエンジンを使った書き方」講座みたいなURLを
ご存知なら、併せて教えてください。
よろしくお願いします。
0677nobodyさん
2010/11/18(木) 21:33:53ID:???その My::Module は singleton にすべきじゃないかな。
0678nobodyさん
2010/11/18(木) 22:36:52ID:???テンプレート出力
ファイルロック
そのほかモロモロ
など、自作関数がいくつかあり、今までは require してただけなんだけど、
これら関数をモジュールにしてファイルを分けるのって非効率だと思います?
なんか自分がどうやって関数とかまとめていけばいいのか分からなくなってきた orz
0679nobodyさん
2010/11/19(金) 09:10:25ID:???use myModule qw/function_to_use/;
できるようにすればいいんじゃない。
0680676
2010/11/19(金) 16:58:32ID:???httpdを再起動するまで反映されない事によくやく気づきました
orz
>>677
singleton初めて知りました。
稀に引数受けて挙動を変える事もあるので、
なんとなくデメリットの方が大きい気がします。
(きちんとsingletonを理解できてないだけかもしれませんが)
>>678-679
私の場合、主にメソッドを返すMy::Moduleと、
DBIやら自分の鯖へのログイン状態(WWW::Mechanize)やら、
主に定義を返すMy::Definitionに分けてます。
が、Perlしか知らないし、そのPerl関連の書籍も一冊も持ってない人間なので
参考にはしない方がいいんじゃないかなーと思います。
(参考にすべき人のご登場をお待ちしております)
0681nobodyさん
2010/11/19(金) 22:46:32ID:???0682nobodyさん
2010/11/20(土) 00:34:47ID:???捨てずに使うことを前提にすると、自分ならこんな感じ。
テンプレート出力はメールの本文作成にも使えそうだから独立したモジュールに。
ファイルロックはファイルシステム関係でまとめたパッケージに放り込む。
パンくずリストは作り次第でフレームワークのプラグイン的位置づけを考えるか、HTML生成系でまとめとくか、かな。
#デザイナーと共同作業するならできるだけテンプレートに直書きしておくのもアリだと思う
#(例えば「>」を「>」に変える程度ならソース追わなくていいように)
まあ、一部分使いたいのに余計なものが付いてくる嫌悪感の度合いで決めたらいいんじゃないかな。
あとちょこちょこ手入れるだろうからバージョンは書いといた方がいいよ。
0683nobodyさん
2010/11/20(土) 00:57:44ID:???そんなつまらんことよりは、機能増やすたびにテスト書くようにして、
git なり svn に入れて一元管理するべき。
0684nobodyさん
2010/11/20(土) 01:59:11ID:???ちゃんとしたMVCで書いてれば動作確認をブラウザからじゃないと出来ない、なんてことにはならないけど。
0685682
2010/11/20(土) 08:29:04ID:???説明不足だったけど、
過去に納品したものに改修の依頼が入った時に$VERSION変数があるといいよという程度の話。
svnで言うならリリースごとにタグを付ける感覚かな。
0686nobodyさん
2010/11/20(土) 11:53:57ID:???この場合個別にエスケープしなければいけないのでしょうか?
my $value = "test(test)[test]{test}test";
my $replace = "(test)[test]{test}";
$value =~ s/$replace/test/g;
上のような場合に結果が「testtesttest」になるようにしたいといった感じです。
単純に置き換えしたいだけなのでraplace関数的なものがあればそれで十分なのですが…
初歩的な質問ですみません。よろしくお願いします。
0687nobodyさん
2010/11/20(土) 12:21:57ID:???0688nobodyさん
2010/11/20(土) 12:59:38ID:???メタ文字で回避できたんですね、
もう一度よく調べて直してみようと思います。
どうもありがとうございました。
0689nobodyさん
2010/11/20(土) 13:01:14ID:???0690nobodyさん
2010/11/20(土) 17:35:05ID:???> ちゃんとしたMVCで書いてれば動作確認をブラウザからじゃないと出来ない、なんてことにはならないけど。
ちゃんとしたMVCについて詳しく。
0691nobodyさん
2010/11/20(土) 20:16:33ID:???ファイルロックほかファイル操作全般
汎用 (time で得たのを文字列で返すとか)
の3つに分けてみた。
オブジェクトにしたら便利なのは、ファイルロックとテンプレート出力ぐらいかな。。。
がんばりゅ!
0693nobodyさん
2010/11/21(日) 08:41:54ID:???684ではないけど、少なくともMに関してはCやVが無くても(ブラウザじゃなくても)テストできるって意味じゃないかな。
#plackは使ったことないから分からないけど、Cも作り次第でテストケース作れないことはないはず
0694nobodyさん
2010/11/21(日) 14:17:21ID:???C に M 置いちゃう?
0695nobodyさん
2010/11/23(火) 03:34:20ID:???・Cにビジネスロジックが書かれていない
・Mに書かれたビジネスロジックは全てスクリプトから呼び出せる
大雑把に言うとこんな感じ。用はブラウザを通してしか呼び出せないロジックを生み出さないようにする。
>>693
確かにApache::TestやTest::WWW::MechanizeなどでCのテストも書けると言えば書ける。
でもそれらはLWPなどを使って、ブラウザからのアクセスを模してるだけなんだよね。
0697nobodyさん
2010/11/24(水) 03:17:12ID:???while($_ = <IN>){
chop;
print "$_";
}
close(IN);
ファイルの内容を1行ずつ読み込んで出力したいのですが出力できません
行入力演算子が効かないのか何なのか、原因がよくわかりません
どうしたらいいでしょうか?
0698nobodyさん
2010/11/24(水) 04:56:07ID:???open(IN, "po.txt"); でイイヨ
ていうかなんで "+>>" なんか使ってんだ?
0699697
2010/11/24(水) 05:07:13ID:???読み書き両方出来た方がいいと思って+>>付けていました
ありがとうございました
0700nobodyさん
2010/11/24(水) 05:36:30ID:???どう違うのかは参考書を見るなりして自分で調べるダヨ
0701nobodyさん
2010/11/24(水) 09:25:00ID:???中身は消さないで欲しくて、でもappendじゃ困るというときに使える
のがないんだよなw 結局sysopenのお世話になるしかないという...
0702nobodyさん
2010/11/24(水) 15:21:47ID:???どういう状況でそんなオープンの仕方が必要になるのかよくわからんが、たとえば
my $filename = "foobar.txt";
open my $fh, -f $filename ? '+<' : '+>', $filename or die $!;
みたいなのでいいんじゃね?
0703nobodyさん
2010/11/24(水) 15:57:56ID:???むかしCGIのアクセスカウンターを自作しようとして困ったんだよね。
その方法だと-fとopenがatomicじゃないので運悪いと書いたのが消えちゃう。
結局'+>>'で開いてとじてから'+<'とかやったっけ。なんか無駄っぽいなーと
思ってすごい嫌だった記憶が。
0704nobodyさん
2010/11/24(水) 16:56:30ID:???0706nobodyさん
2010/11/24(水) 17:13:21ID:???排他制御したいんだったら結局flockなり使わないとだめなんでは。
'+<'でも排他的にopenはできないでしょ。
同時に2つ以上のプロセスから'+<'でopenされて書き換えられたら、
内容が消えることはないとしても本来の値と食い違う可能性があると思うが。
そこらへんはsysopenでも同様なんでは。sysopenだと排他的にopenできたりすんのかな。
>>704
あるファイルに対して読んだり書いたりを同時にしたい時に使う。
おいらも使ったことない。
0707nobodyさん
2010/11/24(水) 17:43:05ID:???更新の必要があるログを開く時
< で読み込んでも、更新しようとする時一々閉じてから開かなきゃいけないでしょ?
+< で開いておけば、seek するだけで書き出しできる。
アクセスが少なくて DISK IO が少ないなら、いったん閉じて開いてもいいとは思うけど・・・
0708nobodyさん
2010/11/24(水) 18:11:30ID:???当時は +< で開いた後さらににflockしてました。
sysopenというのがあるというのを知ったあとは、
sysopen FH, 'file', O_RDWR|O_CREAT|O_EXLOCK
で一発でできて感動したものです。
今だとDB使っちゃいますけどね。
0709nobodyさん
2010/11/24(水) 18:31:11ID:???0710nobodyさん
2010/11/24(水) 18:50:39ID:???プロセス1、ファイルが存在しないと判別
プロセス2、ファイルが存在しないと判別して作成してflockまで行う
プロセス1、ファイルが存在してなかったから作成(プロセス2によりロック中)してデータ壊れる
これで壊れないか?
0711nobodyさん
2010/11/24(水) 18:52:42ID:???DBと同様なトランザクションの仕組みって
perlで可能なの?
0712nobodyさん
2010/11/24(水) 18:58:55ID:???0716nobodyさん
2010/11/24(水) 20:03:34ID:???まあ"DBと同様のトランザクション"は実現できるんじゃないかと。
必要な機能だけに絞って実装すればいいんだし。
インタフェースも別にSQLに準拠しなくても好きなように設計すればいいし。
DBでflockによる排他処理とか面倒なことを考えなくていいのは
DBが単独で一手に集中してそのへんを引き受けてるからで、
片や複数プロセスが素のファイルにアクセスする時にflockとかで排他処理をするのは、
競合しないよう一手に引き受けてくれるまとめ役(交通整理役、管理役)がいないからで、
だったらデータの面倒を集中的に見てくれる、独立して動作するプログラムをperlで書いて、
複数プロセスからのデータのアクセスはそいつを介してやるようにすればいい訳で、
それはつまりperlでDBシステムを書くってことになる訳で。という話。
といっても実際に作ったことがある訳じゃないんで具体的にどう作るかとかは
実際に作ってみないとわかりません。
0717nobodyさん
2010/11/24(水) 20:17:47ID:???初心者の洞察でスマンが
とあるプロセス
my $flagfile="locked";
while(!do{ open my $fh,">",$flagfile; close $fh; }) {}
# ファイル処理
unlink $locked;
別のプロセス
my $flagfile="locked";
while (-e $flagfile) {}
# ファイル処理
■ このスレッドは過去ログ倉庫に格納されています