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

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん2006/09/15(金) 14:01:51ID:gobry0n2
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >>2-10

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0873nobodyさん2006/11/19(日) 21:59:36ID:???
>>872
らくだ本を買いに行ってました...
もう一度よく確認してみます。
ありがとうございました。
0874nobodyさん2006/11/20(月) 15:06:26ID:???
質問ですCarpでCGIのデバッグを行っているのですが
local $method = @_;
のように宣言する行で
Global symbol "$method" requires explicit package name at test.cgi line 74.
とエラーが出てしまいます
これはどういった原因が考えられるのでしょうか
分かるかたいましたらお願いいたします。
0875nobodyさん2006/11/20(月) 15:24:14ID:???
スカラ変数の中身が数値かそれ以外かを判断するにはどうしたらいいんでしょうか?
0876nobodyさん2006/11/20(月) 15:34:53ID:???
>>875
Scalar::Utilのlooks_like_number
0877nobodyさん2006/11/20(月) 15:50:27ID:???
>>874
エラーメッセージ読めばだいたいわかると思うが、さらに詳しくしりたければ
perldiag(1)を読め。

Global symbol "%s" requires explicit package name
(F) You've said "use strict vars", which indicates that all vari-
ables must either be lexically scoped (using "my"), declared
beforehand using "our", or explicitly qualified to say which pack-
age the global variable is in (using "::").

'use strict vars'が指定されているので、すべての変数は("my"を用いた)
レキシカルスコープの変数か、事前に"our"で宣言されるか、("::"を用いて)
明示的に修飾することでどのパッケージに所属するかを示したグローバル
変数でなければなりません。
08788752006/11/20(月) 15:51:17ID:???
>>876
ありがとう。
0879nobodyさん2006/11/20(月) 20:27:04ID:???
>874
サブルーチン 呼び出してるときに、値が入っていないのでは?

shiftしれば、その結果でわかるかと思う
0880nobodyさん2006/11/20(月) 20:51:34ID:???
>>879
use strict 下で宣言されてない変数を使おうとした時のエラーだって >>877 で書いてあるじゃない。
local は既に宣言されてる変数の値の変化を局所化するだけで、変数の宣言にはならないんだってば。
my か our で宣言しないとダメ。あやふやな回答は質問者を混乱させるだけだよ(´・ω・)
0881TORA2006/11/20(月) 22:44:57ID:a7JS476D

はじめまして
 
最近Perlを勉強しはじめたものなんですが
「数列を配列に入れ、偶数だけ表示させてください」
配列とかわかるのですが偶数だけ表示とかっていうのがわかりません。
周りの人に聞いても知らない人が多いので助けてください><
0882nobodyさん2006/11/20(月) 22:50:09ID:???
>>881
宿題は自分でやりなさい。

ヒント
1 % 2 = 1
4 % 2 = 0
0883nobodyさん2006/11/20(月) 22:51:03ID:???
>>881
考えるんだ
偶数と奇数の違いを考えるんだ
0884nobodyさん2006/11/20(月) 23:04:46ID:???
算数からか・・・
0885nobodyさん2006/11/20(月) 23:12:06ID:???
こうですか!?わかりません!
use strict;
use Math::BigInt;
use Tie::LazyList;
tie my @seq, 'Tie::LazyList', [ 1 ], sub { my($array_ref, $n) = @_; $n };
for my $n (1..20) {
 my $x = Math::BigInt->new($seq[$n]);
 print "$x\n" if $x->is_even;
}
0886nobodyさん2006/11/20(月) 23:15:17ID:???
% 2 より & 1 の方がいいと思うんだけど、何か問題あったりする?
0887nobodyさん2006/11/20(月) 23:17:56ID:???
どっちでもいい
ただ、4 % 2 = 0 じゃなくて 4 % 2 == 0
0888nobodyさん2006/11/20(月) 23:20:46ID:???
>>886
問題はないね。ただそれではたぶん >>881 がロジックを理解できない気がする。
0889nobodyさん2006/11/20(月) 23:24:26ID:???
>>887
トラップ入れといたつもりなのにぃ
0890nobodyさん2006/11/20(月) 23:29:40ID:???
>>886
$ perl -e 'print 1000000000000 & 1'
1
0891nobodyさん2006/11/20(月) 23:32:48ID:???
2.0とかでも大丈夫?
0892 ◆TWARamEjuA 2006/11/20(月) 23:47:51ID:????BRZ(6677)
あっちで使った技を取り入れつつ♪

my @Array = ( 1.. 1000 );
my %number;
@number{@Array} = (1) x @Array;

printf qq|%d\n|, $_ for grep not( $_ % 2), keys %number;

# 乱数っぽく♪
0893nobodyさん2006/11/20(月) 23:50:32ID:???
foreach(@rndnums){
print $_ if !($_ % 2);
}
0894nobodyさん2006/11/21(火) 00:03:52ID:???
田村清姫さんと空英彦さんが結婚しました。さてお嫁さんのなまえは何でしょう
0895TORA2006/11/21(火) 00:11:22ID:???
みなさん迷惑かけてすいませんでした。
みなさんの出してくれているソースがまったく理解できずにいます。
まだ勉強して無いところが多かったみたいです。
本当に迷惑かけてすいません。
0896nobodyさん2006/11/21(火) 00:11:36ID:???
井上順太郎
0897nobodyさん2006/11/21(火) 00:12:35ID:???
本当にどれも理解できないの?
だったら0から勉強しなおしなよ
0898nobodyさん2006/11/21(火) 00:19:46ID:???
だから初心者スレ来てるんじゃ
0899TORA2006/11/21(火) 00:20:49ID:???
0から始めたばかりなんですがmy@Array my%numberまだとか見たことないので
0900nobodyさん2006/11/21(火) 00:21:52ID:???
正規表現でHTMLタグを簡易的に表すことについて質問です!

1. <a href=~>
2. </a>

上記の二つを簡潔に表すのに、</?a\s*.*?>としてみたものの<a>というのにもマッチしてしまいます。
/があったら属性なし、/がなければ属性必須にするような後方参照は可能でしょうか。
よろしくお願いします!

# <a>がHTMLの文法として正しいのかどうかは知りません
0901nobodyさん2006/11/21(火) 00:25:44ID:???
>989
そんなんググるか、リファレンスとか持ってれば必ず載ってるべ?
理解しようとしない・調べようとしないでは、ここで聞くだけ無駄では?

>990
</?a\s*.+?>
はどう?
0902nobodyさん2006/11/21(火) 00:27:05ID:???
\s*←空白が無くてもマッチ
.*?←文字が無くてもマッチ
09039002006/11/21(火) 00:32:26ID:???
</?a\s*.+?>だと</a>がマッチしないんですよ。
/の有無で分岐するみたいな巧妙な文法ってないでしょうかね。
0904nobodyさん2006/11/21(火) 00:34:33ID:???
普通に|使えよ
0905nobodyさん2006/11/21(火) 00:39:43ID:???
あぁそっか+じゃだめだな
テキトーすぎですまそ
0906nobodyさん2006/11/21(火) 00:40:40ID:???
=~ #<a\s+.*?>|</a>#i
09079002006/11/21(火) 00:51:46ID:???
やっぱそれしかないですかね。正規表現はまだしらない機能がいっぱいなので、
ひょっとしてと思ったんですが。ありがとうございます。
0908nobodyさん2006/11/21(火) 00:53:27ID:???
>>900
実直に書いてみた。
my @str = ('<a href=...>', '</a>' , '<a>', '</a hoge>' ) ;

for my $str ( @str ){
 my $flag = 0 ;
 if ( $str =~ m{\<
       (/(?{ $flag = 1 })|(?{ $flag = 0 }))
      a
      (??{ $flag == 0 ? '\s+\S+.*?' : '' })
       \>}x ){
   print $str . "\n" ;
 }
}

アホす。
0909nobodyさん2006/11/21(火) 00:59:54ID:???
>>908
> (/(?{ $flag = 1 })|(?{ $flag = 0 }))
なるほど、|を使ってマッチしなかったときはフラグを上書きすりゃいいのか。勉強になった
0910nobodyさん2006/11/21(火) 01:13:46ID:???
m{</?(?(?<=/)a|a\s+.+?)>} # で実現できるけど、でも読める? ^^;
09119002006/11/21(火) 01:14:10ID:???
>>908 
すごいっす!今のところ全然意味が分からないですが、いずれ役に立ちそうな予感がします。
09129002006/11/21(火) 01:28:08ID:???
>>910
これだ!2つ目の?がif文になってるんですね。勉強になりました。
aを何とか一回に収めたいところですが、自分で考えてみます。
0913nobodyさん2006/11/21(火) 02:08:28ID:???
コーディングとはちょっと違うんですが、質問です。

CPANでモジュールをインストールしたいのですが、File::Copyというモジュールがインストールできません。
エラーコードは以下の通りでした。

cpan > install File::Copy
CPAN: Storable loaded ok
Going to read /home/account/.cpan/Metadata
Database was generated on Mon, 20 Nov 2006 05:24:36 GMT
Running install for module File::Copy
Running make for N/NW/NWCLARK/perl-5.8.8.tar.gz

The most recent version "2.09" of the module "File::Copy"
comes with the current version of perl (5.8.8).
I'll build that only if you ask for something like
force install File::Copy
or
isntall N/NW/NWCLARK/perl-5.8.8.tar.gz
Running make test
Make had some probrem, maybe interrupted?Won't test
Has no own directory
Running make install
Has no own directory
Make had some probrem, maybe interrupted?Won't install

サーバはさくらサーバです。
LWPモジュールはインストールできました。そのモジュールは5.8.4というフォルダ以下に入っています。

ご回答お願い致します。
0914nobodyさん2006/11/21(火) 02:39:03ID:???
標準で入ってないの?
09159082006/11/21(火) 07:58:15ID:???
>>911
知って数年になるが役に立ったことなどないよw
0916nobodyさん2006/11/21(火) 09:06:09ID:???
そんな読みにくいコードは遊びでしか書かないわな。
0917nobodyさん2006/11/22(水) 00:53:26ID:???
>>913
夜間中学で学びなおして、読めるようになれ。
0918JAPU ◆lVJAPUTeX. 2006/11/22(水) 01:29:50ID:???
>>913

ずばりのメッセージが出てますよ?
一応大雑把に解説。

> [The most recent version "2.09" of the module "File::Copy"]
> comes with [the current version of perl (5.8.8)].

モジュール "File::Copy"の最新版である "2.09" は現行版のperl (5.8.8) に含まれます。

> I'll build that [only if you ask for something like
> force install File::Copy
> or
> isntall N/NW/NWCLARK/perl-5.8.8.tar.gz]

"force install File::Copy" や、"install N/NW/NWCLARK/perl-5.8.8.tar.gz" のような
(通常とは違う) 要求があったあった場合にだけビルドします。


http://www.excite.co.jp/world/english/
上手く解釈できない単語をちょっと置き換えるだけでそれなりの日本語が出てきます。
File::Copy -> File_Copy
"2.09" -> 2.09
(5.8.8) -> 5.8.8
など。
0919nobodyさん2006/11/22(水) 11:14:05ID:???
perlはじめたばかりなんですが、スクリプト作ってると
何行目でエラーでたのかわかりません。
どんなエラーか知る方法ありますでしょうか。
0920nobodyさん2006/11/22(水) 11:33:50ID:???
ログ見ろ
それかブラウザにエラーを表示するモジュールがある
それかKENTでスクリプトエラーを表示するスクリプトが置いてある

お好きなのをどうぞ
0921nobodyさん2006/11/22(水) 11:37:28ID:???
>>920
さっそく、ありがとうございます。
見てみます。
0922nobodyさん2006/11/22(水) 16:02:01ID:???
>>920
そのアドバイスはないだろw
0923nobodyさん2006/11/22(水) 17:29:09ID:???
じゃあ、とりあえずは

use strict;
use warnings;

最初にこの2行を入れておけ。
CGI書いてるんなら、

use CGI::Carp qw/fatalsToBrowser/;

これも追加。
0924nobodyさん2006/11/22(水) 19:01:32ID:???
Apache 2.2.3 を Linux (Fedora Core 4) 上で動かしています。
Perl のバージョンは v5.8.6 です。

Apache の設定で 「LogLevel debug」 にしても (warnの場合でも)、Apache のログに Perl のエラー箇所が出力されません。

何行目にエラーがある、といった情報が欲しいのですが、この程度のエラーのみとなります。
[Wed Nov 22 18:51:19 2006] [error] [client 127.0.0.1] Premature end of script headers: test.cgi

詳しいエラーを出力する方法は無いでしょうか?

CGI/Perl のソースは次の通りです。

-----------------------------------
#!/usr/bin/perl

print "Content-Type: text/html\n\n";
hoge; # 意図的にエラーを発生させてます。
-----------------------------------
09259242006/11/22(水) 19:03:09ID:???
ちなみに、>>923 の3行を書いても、ブラウザには Internet Server Error で
Apache のエラーログには [Wed Nov 22 18:51:19 2006] [error] [client 127.0.0.1] Premature end of script headers: test.cgi が出力されるだけです。
09269242006/11/22(水) 19:06:27ID:???
すみません、Perl の改行コードが間違っていたようですorz
09279242006/11/22(水) 19:15:19ID:???
ほんとに申し訳ないです。

use warnings;
use CGI::Carp qw/fatalsToBrowser/;

のどちらも書かなくても、Apache のエラーログにはCGIエラーが記録されていたようです。

CGIエラーなんてもんはバーチャルホストのエラーログに記録されるに決まっている、と考えていたのですが
Apache全体のエラーログに出力されていたようです。
0928nobodyさん2006/11/22(水) 19:24:33ID:???
>>923
use strict; は 宣言されていない変数の使用などをエラーとするなどの厳格な処理をするということであることは分かっていて、
use CGI::Carp qw/fatalsToBrowser/; はエラーをブラウザに出力する、ってことは分かるんだけど、
use warnings; って具体的にどういう時に役にたつんでしょうか?

ヘルプを見た限りでは可能な限り警告を出力する、だそうですが、
use strict; のみで出ないエラーが use warnings; で出たという経験はありません。
0929nobodyさん2006/11/22(水) 20:03:16ID:???
>>928
横レス
perldoc perllexwarn
してみろ。例も山ほど載ってる。
0930nobodyさん2006/11/22(水) 23:29:23ID:???
>>928
> use strict; のみで出ないエラーが use warnings; で出たという経験はありません。

大丈夫。そのうち経験できるから。
0931nobodyさん2006/11/23(木) 00:06:00ID:???
特定のサイトのソースを定期的に取得するスクリプトを作ったんだけど、
ブラウザを閉じてもスクリプトを動かし続けるにはどうしたらいいの?
0932nobodyさん2006/11/23(木) 00:10:18ID:???
cron
0933nobodyさん2006/11/23(木) 00:20:39ID:???
>>932
サンキュー
0934nobodyさん2006/11/23(木) 01:26:43ID:???
毎日ある時間になったらログファイルを削除するようにしたいのですが
cron使えないので、そのある時間以降の最初のアクセス時に消すようにしたいです

例えば毎日6時とすると

if( $now_date{'hour'} < 6){
$dtp = 1;
}

if( $now_date{'hour'} >= 6 && $dtp == 1){
unlink 'log.dat';
$dtp = 0;
}

個別に時間の取得やフラグ判定では削除はできるのですが
これを組み合わせるとうまくいきません

どうすればいいでしょうか?
0935nobodyさん2006/11/23(木) 01:49:14ID:???
最初のアクセスかどうかはどうやって判定してるの?
あと、2つのif文の間に何かの処理があるのか知らないけど、2つ目のif文に
時刻の判定は不要では?一回目でフラグたったんだから。
0936nobodyさん2006/11/23(木) 01:52:56ID:???
フラグをファイルかなんかに保存すれば?
0937nobodyさん2006/11/23(木) 02:00:56ID:???
時間取得して、6時以降だったら6時の日時を書き出しし、
その日にちで判断しかない?
09389342006/11/23(木) 02:14:59ID:???
6時前だったらフラグを1にする

6時過ぎてフラグが1だったらログを消す
フラグを0にする

それ以降の6時過ぎのアクセスはフラグは0なので
ログ削除は実行されない

これじゃだめなのかな

0939nobodyさん2006/11/23(木) 02:21:18ID:???
本人ならやってみなされ
0940nobodyさん2006/11/23(木) 02:22:35ID:???
フラグってひょっとして変数のこと言ってるでしょ。いろいろ誤解してるよ。
フラグは外部にファイルか何かで残さないとだめ。下記、雰囲気のみ。

### タイムスタンプの古いフラグを削除
(-d 'flag' and (stat('flag'))[10] < $threshold_time) and rmdir 'flag';

### フラグがなければ最初のアクセス
unless (-d 'flag') {
unlink 'log.dat';
mkdir 'flag';
}
09419342006/11/23(木) 03:11:45ID:???
なるほどわかりました
ありがとうございます
0942nobodyさん2006/11/23(木) 16:00:23ID:???
>>919
#!/usr/bin/perl

...
あなたの記述したperlコード
...

↓上のコードを下のように書き換えればエラーがブラウザで見えるから。
 注:エラーの行数は__END__の真下の行を1行目としてカウントされるよ。

#!/usr/bin/perl

use strict;
use warnings;

print "Content-Type: text/html\n\n";
eval join'',<DATA>;
print $@;

__END__
...
あなたの記述したperlコード
...
0943nobodyさん2006/11/23(木) 20:42:06ID:Hjnm2TEJ
2chの名前欄に何かの文字を入力したらオミクジが引けたりするやつあるじゃないですか?
あれを掲示板につけたいんですけど
掲示板の文の中になにかの文字を入れて、オミクジの結果を表示するところまではできるんですけど
それは書き込むたびにランダムに表示が変わっちゃうんですけど。
それを1日ごとに変わるようにできないでしょうか?
0944nobodyさん2006/11/23(木) 21:09:52ID:???
ちょっと↑の流れを読んでヒントにするんだ
0945JAPU ◆lVJAPUTeX. 2006/11/23(木) 21:12:01ID:???
$random = int(time/60/60/24) ^ unpack "%C*", $name;
とか? ただし、深夜の12時が区切りになるけど。
正確に24時間以上、という条件なら cookie でホゲ。
0946nobodyさん2006/11/23(木) 21:13:07ID:Hjnm2TEJ
>>944
フムフム
ありがとう
0947nobodyさん2006/11/23(木) 21:13:49ID:Hjnm2TEJ
>>945
フムフム
やってみます
0948nobodyさん2006/11/23(木) 21:14:19ID:Hjnm2TEJ
>>945
ありがとうございます。
0949nobodyさん2006/11/23(木) 22:13:47ID:???
最後に「r」入力したらもう一度ってのをやりたかったんですが
1度しか入力できません
何がいけないのでしょうか?簡単にやるのはどうしたらいいのでしょうか?

use strict;
my $key = 'r';
do{
#色々と
print "再実行はrを入力\n";
$key = getc;
}while($key eq 'r');
0950nobodyさん2006/11/23(木) 23:03:59ID:???
\nがバッファされているから。一行まるごと読むべし。
0951nobodyさん2006/11/23(木) 23:05:01ID:???
訂正。
\nが、ではなく、\nまで
0952nobodyさん2006/11/24(金) 00:08:52ID:???
>>949
1key コマンドをやりたいなら Term::ReadKey の利用も検討してみよう。
結局使わなかったとしても、調べる過程でいくつかの事を学べるよ。
0953nobodyさん2006/11/24(金) 17:09:36ID:???
サイトAにアクセスすると自動的にサイトBに転送される状況で、
スクリプトにサイトAのアドレスが入力された場合に、
サイトBのアドレスを表示するにはどうしたらいいの?
0954nobodyさん2006/11/24(金) 17:36:11ID:???
転送されない状況なら何を表示するの?
0955nobodyさん2006/11/24(金) 17:52:00ID:???
考え方としてはリンク集の登録
転送URLだったら転送後のURLとして処理
非転送URLだったらそのまま

見たいな感じ
0956nobodyさん2006/11/24(金) 18:34:51ID:???
httpのrfcでも読めば?
0957nobodyさん2006/11/24(金) 19:07:04ID:???
HTTP::Responseの->baseで表示できたみたい
0958nobodyさん2006/11/24(金) 21:28:29ID:???
>>953
アダルトサイト?w
09599492006/11/24(金) 22:01:46ID:???
>>950-952
ありがとうございました

chomp($key = <STDIN>);でうまくいきました
Term::ReadKey;の使った方もできました
でも仕組みはよくわかりませんが
がんばって勉強します・・・
0960nobodyさん2006/11/24(金) 23:14:45ID:???
>>958
違うよw
この文章でエロサイトが思い浮かぶなんて相当あれだな
0961nobodyさん2006/11/25(土) 02:40:29ID:???
相当あれじゃなくて、その程度も思いつかないのがあれでしょ
0962nobodyさん2006/11/25(土) 02:41:15ID:???
ま、アレってことでひとつ…
0963nobodyさん2006/11/25(土) 09:10:31ID:???
httpのrfcとか言ってるようじゃまだまだだな
0964nobodyさん2006/11/25(土) 13:24:40ID:???
フォームから送られてきたデータを分解する時に、

$value =~ tr/+/ /;

がよく使われてるんだけど、


複数の文字じゃないのに「$value =~ s/+/ /;」を使わない理由、
そもそもなぜ「+」をスペースに変換する必要があるのか
教えて
0965nobodyさん2006/11/25(土) 13:51:10ID:???
1つ上も読めないのか?
0966nobodyさん2006/11/25(土) 14:29:50ID:???
常識的に考えて、文字の置換(変換)するだけなら s/// より tr/// の方が速いだろ・・・
「+」をスペースに変換する必要があるのは、スペースが「+」に変換されてるからだろ・・・
0967nobodyさん2006/11/25(土) 16:06:45ID:5hW/EMoW
2chのおみくじあるじゃないですか?
あれってどうすればいいですかね?
0968nobodyさん2006/11/25(土) 16:08:05ID:???
↑ダメな質問の例
0969nobodyさん2006/11/25(土) 16:11:17ID:???
名前が!omikujiなら、ランダムで結果に変換。
0970nobodyさん2006/11/25(土) 16:23:19ID:5hW/EMoW
>>969
そのやりかたを詳しく
0971nobodyさん2006/11/25(土) 16:32:40ID:???
(´・ω・`)そこを考えるのを楽しめないんだったら、、、
0972nobodyさん2006/11/25(土) 16:33:21ID:???
>>970
どれくらい?
レス数が950を超えています。1000を超えると書き込みができなくなります。