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

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん2006/07/27(木) 17:04:23ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0896nobodyさん2006/09/09(土) 03:06:29ID:FjbM6rE4
rootで実行しているperlスクリプトから
 $filename = "filename.dat";
 chown www,GROUPNAME,"$filename";
としても反映されません。

ユーザ:root
グループ:wheel
でログインをした状態でコマンドラインから色々試してみたところ
自分自身のユーザ・グループ以外には変更できないのですが
www,GROUPNAME とするにはどのようにしたら良いのでしょうか。
0897nobodyさん2006/09/09(土) 03:06:37ID:???
>>895
「変数 スコープ perl」 でぐぐればわかるとおもう。
0898nobodyさん2006/09/09(土) 04:10:20ID:???
>>896
uid, gidでやっても?
chown scalar(getpwnam('www')),scalar(getgrnam('GROUPNAME')),"$filename";
0899nobodyさん2006/09/09(土) 04:47:58ID:???
>>898
ありがとうございます!
uid,gidで解決しました。
0900nobodyさん2006/09/09(土) 04:59:01ID:???
質問です。
auでフォームから送信すると次のページのURLに
?x-up-destcharset=17
と付くんですがなぜですか?

また、これを表示させない方法があれば教えてください。
0901nobodyさん2006/09/09(土) 04:59:38ID:???
>>895
どんな結果を期待してたんだ?
nakasotoと出力されて当然なのだが???
09028962006/09/09(土) 05:29:02ID:???
>>899
で解決して喜んではいたのですが
ユーザ名,グループ名 では駄目だった理由が知りたくて
戻って参りました...どなたかお教えください。
perl chown で検索した解説サイトではほぼ全てが
「chown ユーザ名,グループ名,ファイル名」
という説明になっているということは一般的にはuid,gid形式では
指定しないのでしょうか。
環境はFreeBSD+perl5.8.8です。
0903nobodyさん2006/09/09(土) 05:46:10ID:???
>>900
スレ違い
0904nobodyさん2006/09/09(土) 05:55:38ID:???
>>903
これはPerlの設定ではどうしようもないって事ですか?
わかりましたスレ違いすみませんでした
0905nobodyさん2006/09/09(土) 07:40:54ID:???
>>900 >>903
Perl がどこに出てきてるのだ?
0906nobodyさん2006/09/09(土) 10:19:37ID:???
>>902
まずperldocではちゃんと数値のUID,GIDと明言されてる。
そして、素人が作ったPerl解説サイトはデタラメ書いてる場合もある。

それはそうとして、どこでどう検索したのか書いてみろ。
yahooとgoogleで「perl chown」のTOP5件チェックしたが正しかったぞ。
09078952006/09/09(土) 10:32:15ID:???
>>897
ありがとうございます。
ファイルスコープなるものとブロックスコープなるものがあったんですね。

>>901
名前は知りませんでしたが、myはブロックスコープで動くと思っていました。
後者の出力が正しいとするなら、
前者はブロックの外でmy宣言してるのにもかかわらず、
ifのブロック内で$testが出力されているのが不思議だったのです。
0908nobodyさん2006/09/09(土) 11:39:12ID:???
>>907
スコープがネストされてる場合内側から外側のスコープが見えるよ
他の言語でも言うグローバル変数はそういう使い方
09098952006/09/09(土) 13:05:50ID:???
>>908
知りませんでした。ありがとうございます。
{
my $block;
{・・・・・・}
{
{・・・・・・}
}
}
などでも・・・・・・の位置から$blockをみれるということですか。
ということはサブルーチンに移るときだけ気をつければいいんですね。
0910nobodyさん2006/09/09(土) 14:40:37ID:???
>>909
ついでにlocalも調べときな
0911nobodyさん2006/09/09(土) 21:10:29ID:???
localは覚えないでいい
0912nobodyさん2006/09/09(土) 21:16:13ID:???
>>911
0913nobodyさん2006/09/09(土) 21:21:15ID:???
>>911
0914nobodyさん2006/09/09(土) 21:28:20ID:????BRZ(1002)
local厨乙
0915nobodyさん2006/09/09(土) 21:36:38ID:???
>>911
0916nobodyさん2006/09/09(土) 21:38:39ID:???
do { local $/ ; <> } ;
local $Data::Dumper::Deparse = 42 ;
とかで必要すよ義務っすよ must っすよ。
0917nobodyさん2006/09/09(土) 21:48:54ID:???

  ま た コ ン パ ク ト か
0918nobodyさん2006/09/09(土) 22:11:50ID:???
>>907
{
  my $x = "soto_x ";
  my $y = "soto_y ";
  {
    my $y = "naka_y ";
    print "naka: ", $x, $y, "\n";
  }
  print "soto: ", $x, $y,"\n";
}
{
  print "yoso: ", $x, $y, "\n";
}

ファイルスコープについては、この延長で「ファイルを丸ごと取り囲む見えないブロック」があると考えれ。
サブルーチンに移る時に何を気をつけるのかは知らんが。
0919895,9072006/09/09(土) 22:28:45ID:???
>>910
localは環境変数など複数あってはいけない変数に違う値を付ける場合に必要なんですね。

>>918
分かりやすい説明ありがとうございます。
サブルーチンに移るときに気をつけるというのは
引数を渡すのを忘れて、変数を直接参照しないように
ということです。言葉足らずですみませんでした。
0920nobodyさん2006/09/09(土) 22:29:47ID:???
> local
他にも、こういう使い方とかってしないもんかね?

my $hoge = { fuga => 1, piyo => 2 };
{
    local $hoge->{piyo} = 3;
    print $hoge->{piyo};
}
print $hoge->{piyo};
0921nobodyさん2006/09/09(土) 22:58:48ID:???
>>920
必然性があるならやったらいい。
しかし設計としてはほめられたもんじゃない。
そこに合理性がない上に恥じらいもないなら、少なくとも僕はそれをクソと呼ぶ。
0922nobodyさん2006/09/09(土) 23:09:18ID:???
WindowsXP+ActivePerlでインストール直後のまっさらな状態で

cpan Net::Amazon
すると

Undefined subroutine &main::UpdateHTML_blib called at -e line 1.
NMAKE : fatal error U1077: 'C:\Perl\bin\perl.exe' : リターン コード '0xff'
Stop.
nmake -- NOT OK

と出てインストールできません。どうしたらインストールできるでしょうか?
ズブの素人なのでなってない質問の仕方と思いますが、
神様達の優しさに期待します。よろしくお願いします。
0923nobodyさん2006/09/10(日) 00:17:14ID:???
cpanでぐぐりなさい
もしくはppmにしておきなさい
わからなければ検索
0924nobodyさん2006/09/10(日) 12:43:26ID:???
16進数をバイナリにしてそれを保存し、printでも表示したかったのですが、
print pack ("H*","$d16")
で、$d16のなかに00が含まれているとプリントがその手前までしかされません・・・
何が原因でしょうか?

0925nobodyさん2006/09/10(日) 13:34:34ID:???
>>924
どこにprintしてるのか知らんがnullは文字列の終端。
表示する端末によっては表示が打ち切られたり、半角スペースに置き換えられて続行したり…
バイナリエディタの右側の枠のようなものを作りたいの?
09269242006/09/10(日) 15:17:01ID:???
>バイナリエディタの右側の枠
はい。Perlで簡易バイナリエディタを実験的に作ってみようと思いまして・・・
00は違う値に置き換えてからprint表示する必要があるのですか。
ありがとうございます。
09279242006/09/10(日) 15:17:52ID:???
連続書き込みすみませんorz

print先はモニタです。
0928nobodyさん2006/09/10(日) 16:54:55ID:???
>>926
まあモニタなのは分かるけど…
nullに限らず各制御コードは何かに置換することでエスケープするのは必要だね。
手っ取り早いのは tr/ -~/./c (US-ASCII以外を置換)とかを通すこと。
マルチバイトに対応させるならもう二捻り。
0929nobodyさん2006/09/10(日) 17:19:33ID:JN7kssrH
elsif とかまじでなんなの?開発してるヤツくるってる。
一文字分タイプする労力減るだろ?とか悦に入ってんの?
elseif と else if で混乱してた方がまだマシ。泣きそう。
0930nobodyさん2006/09/10(日) 17:25:35ID:???
>>929
散々既出
0931nobodyさん2006/09/10(日) 17:38:32ID:???
>>928
ありがとうございました。
マルチバイト対応がんばります。
0932nobodyさん2006/09/10(日) 18:45:21ID:???
elif
0933nobodyさん2006/09/10(日) 22:10:15ID:us6Jx56P
すみません。コーディング中にどうしても分からない事が出てきたので教えていただきたいのですが、\n(改行コード)を含むテキストを出力させたいのですが
print <<EOF
ほげほげ\n
ほげほげ\n
.
.
.
EOF

で出力すると、当然
ほげほげ
ほげほげ
.
.
.
というテキストファイルが出来、出力させたい
ほげほげ\n
ほげほげ\n
.
.
.
というようなファイルを得ることが出来ません
どのようにすれば上記の望む出力結果を得ることが出来るのか教えていただけると幸いです。
0934nobodyさん2006/09/10(日) 22:20:08ID:???
>>933
EOF が付加されるってこと? EOF って付加されたっけ。
とりあえず binmode あたりを試してみては。
0935nobodyさん2006/09/10(日) 22:22:03ID:???
>>933
改行している時点で、(見えませんが)改行コードは入っています。
改行コードではなく、"¥n" という文字が表示されて欲しいなら、

print <<EOF;
ほげほげ¥¥n
ほげほげ¥¥n
EOF

とすれば良いでしょう。
0936nobodyさん2006/09/10(日) 22:23:57ID:us6Jx56P
>>934-935
ありがとうございます
エスケープを重ねるんですね
試してみます
0937nobodyさん2006/09/10(日) 22:24:12ID:???
>>933
print <<'EOF';
0938nobodyさん2006/09/10(日) 22:30:09ID:us6Jx56P
>>936を試して見たらうまくいかなかったのですが、>>937で問題解決しました
有難うございます
0939nobodyさん2006/09/10(日) 22:41:36ID:9Coln3UP
>>937
すげー。初めて知った。
0940nobodyさん2006/09/10(日) 22:58:04ID:???
print "";とprint'';の違いだから知るとか以前の問題な気が・・・
0941nobodyさん2006/09/11(月) 01:05:25ID:???
GETしようとして、
ソケットに繋いでGET送って、
@get = <SOCKET>;
をすると、ごく希にそこで止まってしまうので、
時間切れにさせるか、もっと安全に扱いたいんだけど、
どうするのが普通ですか?
0942nobodyさん2006/09/11(月) 01:13:26ID:???
>>941
$SIG{ALRM} かな。
0943nobodyさん2006/09/11(月) 01:39:19ID:???
やっぱりそんな感じですか
さくっとぐぐってみたら、

> タイムアウト処理ではシグナルを使うため、Windows 系サーバでは使えません。

という記述を見かけたのですが、windowsのActivePerlでは無理ですか?
0944nobodyさん2006/09/11(月) 01:52:52ID:???
Win98系なら、ね。
0945nobodyさん2006/09/11(月) 02:06:35ID:???
読む前にselectしてみるとか。知らんけど。
0946nobodyさん2006/09/11(月) 02:09:00ID:???
試してみたらalarmの行でやっぱり、
The Unsupported function alarm function is unimplemented at 〜
というエラーになってしまいました

代案は何かありませんか?
0947nobodyさん2006/09/11(月) 04:52:42ID:???
$text =~ s/([>>]|^)(>[^<]*)/$1<a href=\"\">$2<\/a>/g;

携帯用の掲示板でアンカーを付けたいんですがこれだとURLが
〜〜.cgi?mode=view&No=>>番号
みたいに番号に>>が入ってしまうんですが数字のみにするには
どうしたらいいですか?
0948nobodyさん2006/09/11(月) 05:01:11ID:???
$text =~ s/([>>]|^)(>[^<]*)/$1<a href=\"〜〜.cgi?mode=view&No=$2\">$2<\/a>/g;

すみませんこうでした
0949nobodyさん2006/09/11(月) 05:37:20ID:???
>>948
[>>] の箇所、[] の使い方を誤解していると思われ。

正しくない正規表現からでマッチさせるべきテキストの例もないので
希望にそうか分からないが、一例を。

s/>>(\d+)/>><a href="〜〜.cgi?mode=view&No=$1">$1<\/a>/g;
09509462006/09/11(月) 23:55:32ID:???
ActivePerlのバージョンを上げたら、alarmに対応してしました
でも、肝心のアラームが作動してくれません
ttp://www.futomi.com/lecture/signal/alrm.html
このあたりを丸コピーしたのですが、

alarm 10;
@get = <SOCKET>;
alarm 0;

という部分でやっぱり止まります
一まとまりの処理の間でしか時間を見てないんじゃないかと思うのですが、
回避する方法はありますか?
0951nobodyさん2006/09/12(火) 00:15:09ID:???
ちなみに、
@get = <SOCKET>;
の部分を、
for (1..100) { print "$_\n"; sleep(1) }
とかに置き換えれば、それはちゃんとタイムアウトします
0952nobodyさん2006/09/12(火) 00:39:45ID:???
selectで読めるか確認しつつちまちま読むのが普通じゃね?
0953nobodyさん2006/09/12(火) 01:25:51ID:???
パラメータが4つある方のselectですよね

ちょっと理解を超えてるので、
@get = <SOCKET>;
と同等のことをしてくれるタイムアウト処理内蔵の安全なパッケージとか
無いでしょうか
0954nobodyさん2006/09/12(火) 04:41:17ID:???
IO::Selectは試した?
0955nobodyさん2006/09/12(火) 12:24:04ID:???
ドキュメントすら見つけられません

ActivePerlでwebから何か読もうとする人はみんな同じ問題を
抱える筈なのに、あんまり困ってないのは、
windowsでそんなことする人がいないということなのかな
0956nobodyさん2006/09/12(火) 12:39:47ID:???
ググレカス
0957nobodyさん2006/09/12(火) 13:15:50ID:???
eval使えよ
0958nobodyさん2006/09/12(火) 21:02:42ID:???
>>955
> windowsでそんなことする人がいないということなのかな

Web から何か読もうとすれば、誰もが LWP を使うからだと思うよ。
0959nobodyさん2006/09/12(火) 21:45:18ID:???
> Web から何か読もうとすれば、誰もが LWP を使うからだと思うよ。

誰もがということにしたい?w
0960nobodyさん2006/09/12(火) 22:00:41ID:????BRZ(1002)
(´ー`)
0961nobodyさん2006/09/12(火) 22:38:52ID:???
それは「タイムアウト処理内蔵の安全なパッケージ」として使えますか?
0962nobodyさん2006/09/12(火) 22:41:32ID:???
よっぽど苦労したいか特殊なことをやりたい人じゃなければLWP使って終わりにするな。
あーあとLWP知らない人(笑)
0963nobodyさん2006/09/12(火) 23:16:43ID:???
>>961
せめて LWP が何であるかくらいは調べてよぅ。
たぶんあなたの手元に POD 内臓のソースが転がってるはずだから。
0964nobodyさん2006/09/13(水) 00:03:59ID:???
安全かどうかは使ってみないと判らないので
それに、良い物なら>>941の時点で真っ先に挙がりそうなものだし
0965nobodyさん2006/09/13(水) 00:45:01ID:???
もう書き込まなくていいよおまえ
0966nobodyさん2006/09/13(水) 00:57:01ID:???
とりあえず、LWP:Simpleを使った版を作ってみた
一日動かしてみてどうなるか
0967nobodyさん2006/09/13(水) 03:07:31ID:???
日記は要らない。
0968nobodyさん2006/09/13(水) 21:40:08ID:???
>>964
残念ながら「ActivePerlでwebから何か読もうとする」という目的が明らかになったのは >>955 の時点なのですよ。

>>966
LWP::UserAgent を使いませんか。タイムアウト処理が欲しいのでしょう?
0969nobodyさん2006/09/13(水) 23:09:53ID:???
やっぱりSimpleだと勝手にタイムアウトはしてくれないか
POSTする必要もあるので、GETだけLWP使うのも変だし、書き直します
0970nobodyさん2006/09/14(木) 04:13:24ID:???
日記は他所でやれ
0971nobodyさん2006/09/14(木) 06:58:33ID:???
今日は、いい天気ですね。
0972nobodyさん2006/09/14(木) 07:32:23ID:????BRZ(3000)
Simpleもタイムアウトあると思うんだけど…
0973nobodyさん2006/09/14(木) 11:55:45ID:???
物騒なもの作っていそうだ。
0974nobodyさん2006/09/14(木) 16:13:18ID:CaEHA0hf
任意の日本語にマッチするパターンを表現したいのですが
どうやればいいのでしょうか?
たとえば文字列"coding"にはマッチしませんが"コーディング"にはマッチする
というような奴です。

0975nobodyさん2006/09/14(木) 16:20:33ID:???
/コーディング/
0976nobodyさん2006/09/14(木) 16:20:44ID:???
( ^ω^)?
0977nobodyさん2006/09/14(木) 16:28:49ID:???
非asciiにマッチさせたいんじゃないかと
0978nobodyさん2006/09/14(木) 16:43:31ID:???
/[^¥x00-¥x7E]/;
別に7Fでもいいけど。
0979nobodyさん2006/09/14(木) 16:45:54ID:???
しまった。マッチさせるのか。
>>978 だと2byteが含まれてるかどうかの確認にしかならんな。
0980nobodyさん2006/09/14(木) 20:12:42ID:5VQgHCQX
教えて下さい。

掲示板で検索フォームを作ってます
検索文字列を全角スペースで区切ると上手くヒットしません・・・
$key_wordはちゃんと区切り文字(半角または全角スペース)で分割されてると表示れるのですが

$key_word =~ s/ / /g;
$key_word =~ s/\t/ /g;
@words = split(/ /,$key_word);

↑これ間違ってますでしょうか?
0981nobodyさん2006/09/14(木) 20:47:10ID:???
split /[\s ]+/, $s
じゃだめなん?
0982nobodyさん2006/09/14(木) 20:53:52ID:???
全角スペースを [ ] の中に入れるのかよwww
09839802006/09/14(木) 20:55:41ID:???
>>981
どうもです
変わりありませんでした。
0984nobodyさん2006/09/14(木) 21:04:27ID:???
ヒント:文字コード
0985nobodyさん2006/09/14(木) 21:13:34ID:???
ああ、ごめん。確かに>>981はEUC-JPかUTF-8じゃないとダメかも。
0986nobodyさん2006/09/14(木) 21:14:21ID:???
誰も使おうとしてくれない | がカワイソス
0987nobodyさん2006/09/14(木) 21:26:15ID:???
>>985
09889802006/09/14(木) 22:24:36ID:???

&jcode'convert(*key_word, "sjis");
これ入れてもダメでした・・・

もっとヒント下さい^^;
0989nobodyさん2006/09/14(木) 23:57:45ID:???
$baka =~ s/(\x81\x40)+/\s/g;
$baka =~ s/\t+/\s/g;
@aho = split(/\s/,$baka);
0990nobodyさん2006/09/15(金) 00:17:01ID:???
>>989
そのREPLACEMENTは無いだろw
0991nobodyさん2006/09/15(金) 00:19:23ID:???
ひどいなw
09929802006/09/15(金) 00:40:01ID:???
>>989
それだと区切れずに
文字列1s文字列2s文字列3 になってしまいます^^;
0993nobodyさん2006/09/15(金) 01:10:55ID:????BRZ(3000)
今は個人情報保護の時代です。
OSやインタプリタのバージョン、コードの内容からも
ある程度個人の特定が可能です。質問の際にはなるべく
最小限のコードだけを提示して、回答を貰えばラッキーというスタンスで臨みましょう。
09949802006/09/15(金) 02:03:11ID:???
すみません・・・自己解決しました
検索ルーチンのミスでした><
0995nobodyさん2006/09/15(金) 05:01:24ID:EabJRhNL
そろそろ継続スレの開設について準備を開始するための議論を開始しませんか?
レス数が950を超えています。1000を超えると書き込みができなくなります。