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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
0494nobodyさん2005/06/21(火) 01:02:18ID:???
>>493 そのための seek だろ。 何言ってんだw
04954822005/06/21(火) 02:15:58ID:???
>>488
説明不足ですみません。
ひらがな + カタカナ + 漢字 + [ー〜] だけを許容したい
ずばり、そのとおりでございます。

「最後のアスキー」とは、何か漏れがあったりしますでしょうか?
0496nobodyさん2005/06/21(火) 02:28:41ID:???
use encode しつつ [\wー〜] ってやるのが一番楽そうなんだがw

最後の $eucpost の後方参照が必要なのかどうかわからないのだった。
まあいるんならいいんじゃない? それで動けば。
0497nobodyさん2005/06/21(火) 08:45:48ID:???
utf8使えるんなら使わない手はない
04984932005/06/21(火) 09:46:03ID:???
>>494
ありがとうございます!なりました。

今までseekを使うことがなく、(<と>>だけ)
いまいち感覚がつかめませんでした。
たすかりました。

ところで、+>>でオープンした場合の書き込みは追記になるので
書き込む前に
seek(OUT, 0, 2);
をする必要はないと考えてよいでしょうか。
今のところ問題ないんですけど、やっておかないとマズイことはありますか?
0499nobodyさん2005/06/21(火) 10:51:42ID:???
以下のようにスクリプトをutf8で書いてやるとうまくいくんですが、
use utf8;
$str='日本語';
print length $str, "\n"; # 3
foreach (split //, $str) {
print sprintf("%04X\x20", ord); # 65E5 672C 8A9E
}
utf8で書いたファイルを読み込んで同じことをやろうとするとだめです。
use utf8;
while(<>){
print length $_, "\n";
foreach (split //, $_) {
print sprintf("%04X\x20", ord);
}
}
ちなみにファイルは、以下のもので、

これはutfであります。

結果は、

~$ perl utf_test.pl utf_test.txt
32
0000 FFFD FFFD 0000 FFFD FFFD 0000 FFFD FFFD 0075 0074 0066 0000 FFFD FFFD 0000 FFFD FFFD 0000 FFFD FFFD 0000 FFFD FFFD 0000 FFFD FFFD 0000 FFFD FFFD 000D 000A

cygwinのperl5.8.5でやってます。どうしたら、日本語マルチバイト認識して
くれるんでしょう。
0500nobodyさん2005/06/21(火) 10:57:18ID:???
さっきの結果は、use Encode;の場合でした。use utf8;だと、
~$ perl utf_test1.pl utf_test.txt
32
00E3 0081 0093 00E3 0082 008C 00E3 0081 00AF 0075 0074 0066 00E3 0081 00A7 00E3 0081 0082 00E3 0082 008A 00E3 0081 00BE 00E3 0081 0099 00E3 0080 0082 000D 000A
です。よろしくお願いします。
0501nobodyさん2005/06/21(火) 11:02:53ID:???
すみません。結構ググったんですが、グルり足りなかったようで。
ttp://sakaguch.com/utf2.html#noteで見つけますた。
use open ":utf8";にすれば、問題なくなりますた。
0502nobodyさん2005/06/21(火) 11:18:14ID:???
連カキコすまソ。
use open ":utf8";
use utf8;
while(<>){
# while(/\p{Hiragana}/g){
while(/[ぁ-ヶ]/g){
print "$&\n";
}
}
みたいにすると、結果はOKなんですが、
Wide character in print at utf_test.pl line 6, <> line 1.
Wide character in print at utf_test.pl line 6, <> line 1.
Wide character in print at utf_test.pl line 6, <> line 1.
Wide character in print at utf_test.pl line 6, <> line 1.
Wide character in print at utf_test.pl line 6, <> line 1.
Wide character in print at utf_test.pl line 6, <> line 1.
Wide character in print at utf_test.pl line 6, <> line 1.
Wide character in print at utf_test.pl line 6, <> line 1.
Wide character in print at utf_test.pl line 6, <> line 1.
これは抑止できないんですかね。
0503nobodyさん2005/06/21(火) 11:44:02ID:???
>>502
binmode STDOUT, ":utf8";

perldiag(1)のそのメッセージの説明に書いてあったわけだが。
0504nobodyさん2005/06/21(火) 13:44:01ID:???
エラーメッセージでぐぐるとかしなさいよ
0505nobodyさん2005/06/21(火) 14:21:11ID:???
>>483-484
なんでparamじゃ駄目なのかわからん。
教えてエロイ人!
0506nobodyさん2005/06/21(火) 16:01:03ID:???
>>498
ファイルロックするなら問題ないんじゃない?
0507nobodyさん2005/06/21(火) 16:19:13ID:???
>>505
POSTしてるからだろ。

ttp://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod の
「POSTとURLパラメータの混合」より:

問い合わせ文字列(引数が後ろについた"?"マーク)が入ったURLへ
POSTするフォームを作成することにより、スクリプトはフォームと
同じように CGIパラメータをURLで受け取ることは可能です。param()
メソッドは、 URLの問い合わせ文字列を無視し、常にPOSTされた
フォームの内容を返します。 URLパラメータを取り出すためには
url_param()メソッドを呼び出してください。
0508nobodyさん2005/06/21(火) 16:51:26ID:???
PHP の $_GET $_POST みたいに両方取れるといいのにね。
05095052005/06/21(火) 17:02:14ID:???
>>507
クエリ付きURLにPOSTすると
paramはPOSTされた値だけ持ってくるってこと?
勉強になった超エロイ人ありがとう!
05105022005/06/21(火) 21:53:39ID:???
>>503-504
ども、ご教示ありがトン。
0511nobodyさん2005/06/21(火) 23:12:56ID:???
Apache2.0.52+Perl5.8.3という環境で、CGIとおなじサーバにある
RSSをHTMLとして出力するCGIを作成中なのですが、

my $rssfile = $cgi->url_param('rssfile');
open(my $fhin, $rssfile) or die $!;

と書くとDOCUMENT_ROOTにあるrss.xmlを出力しようとして
rssfileに/rss.xmlと指定しても出力できません。
仮想パスを物理パスに変換する必要があるのは分かるのですが、
IISのMapPathメソッドのようなものはないのでしょうか?
よろしくお願いします。
0512nobodyさん2005/06/21(火) 23:18:28ID:???
>>511
$ENV{'DOCUMENT_ROOT'}
0513nobodyさん2005/06/21(火) 23:31:31ID:???
>>512
質問の仕方がまずかったですね。
それも考えましたがrssfileが//etc/passwdとかだった場合は
セキュリティ的に問題があると思ったもので。
DOCUMENT_ROOTの中か外かの判断ができればよいのですが。
0514nobodyさん2005/06/22(水) 01:31:35ID:???
>>513
だからこういう事だろ?

my $rssfile = $cgi->url_param('rssfile');

$rssfile =~ s|^[./]*|$ENV{'DOCUMENT_ROOT'}/|;
-f $rssfile || die 'No such file';

open my $fhin, '<' . $rssfile or die $!;

外から渡される文字列は全部危ないんだから、危なくないよう加工・確認
してから使うのがセオリー。問答無用で DOCUMENT_ROOT を基点にして
しまえば中か外か判断する必要はないし、DOCUMENT_ROOT の外の
階層構造をわざわざ外部に教えてあげる必要もない。DOCUMENT_ROOT の
外のファイルを読ませたいのなら、ハッシュを一個用意してそのキーを指定
させる等、パスを直接的に指定させない方法を採ればいい。

%rssfile = (index => '...', news => '...', ... );
if (defined $rssfile{$rssfile}) { ... }
0515nobodyさん2005/06/22(水) 01:34:47ID:???
何で ./rss.xml とかの指定じゃだめなん。

chdir ($ENV{'DOCUMENT_ROOT'});
とかにして、最初の スラッシュ を削除するとか。

つーかそーゆーモジュールすでにありそうだし、それくらいのメソッドくらい自分で造れそうだがw
0516nobodyさん2005/06/22(水) 01:37:48ID:???
>>514 おまい頭いいな。
05175112005/06/22(水) 02:15:15ID:???
なるほど。参考になりました。
ありがとうございました。
0518nobodyさん2005/06/22(水) 11:32:07ID:???
質問です。

ttp://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq5.html#How_can_I_make_a_filehandle_loca
以下抜粋

>上の例では、ファイルハンドルを使う前にそれをスカラー変数に代入していました。
>これは式でもなく、ハッシュや配列の添え字でもなく単純なスカラー変数だけがprintやC<printf>、
>ダイヤモンド 演算子と一緒に使えるのです。コンパイル時にエラーになってしまうような間違いの例を挙げてみましょう:
> @fd = (*STDIN, *STDOUT, *STDERR);
> $got = <$fd[0]>  # 間違い

これって、ハンドルのリファレンスをハッシュに入れることは出来ないってことなんでしょうか。
以下のソースでエラーは出ないのですが、書き込みも読み込みも動きません。

package p_file;
my %ref_handle;        #クラスで使うファイルハンドルのハッシュ(複数のファイルを同時に開けるようにしたい)

sub open {
 my ($id, $path, $file) = @_;
 local *FILE;
 $ref_handle{$id} = \*FILE;              #←ここが問題?
 open($ref_handle{$id} , "+>>$path$file");
}
sub read {
 my ($id, $row, $begin) = @_;
 my @tmp = <{$ref_handle{$id}}>;
〜以下略
sub close {
 my ($id) = @_;
 close($ref_handle{$id});
}
0519nobodyさん2005/06/22(水) 11:51:25ID:???
>>518
君が引用しているのは一つ下の問答のようだが、当の URL の問答に

> 複数のハンドルや無名ハンドルを作りたいのであれば、
> Symbol, FileHandle, IO::Handle といったモジュールを参照してください。

とあり、その例も書いてある。また君が引用している問答の中に、

> このアプローチは print や printf をオブジェクトメソッドの呼び出しの
> ように扱うものですが、これはダイヤモンド演算子には使えません。
> なぜなら、ダイヤモンド演算子はカンマなしの引数を取る関数ではなくて
> 本当の演算子だからです。

と書いてある。
0520nobodyさん2005/06/22(水) 12:03:52ID:???
>>519
ありがとうございます。
確認不足でした。。
0521nobodyさん2005/06/22(水) 13:06:21ID:???
sprintf、printfの書式指定文字列について質問です。


my($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($_[0]);
return sprintf("%04d%02d%02d", $year+1900, $mon+1, $day);


なら "%04d%02d%02d" → 20050622 のようになることは理解できるのですが、


($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($new);
$day = sprintf("%.4d/%.2d/%.2d", $year+1900, $mon+1,$day);


で "%.4d/%.2d/%.2d" → 20050622 となるのはどうしてなんでしょうか。
この『.』の意味が、調べてみても手元の本には載っていなくてわからず、すっきりしません。
桁数の指定(例えば『5.2』とかの)の . ではないようですし・・・

そして、"%.4d/%.2d/%.2d" は "%04d%02d%02d" に書き換えちゃってもかまわないでしょうか?
0522nobodyさん2005/06/22(水) 13:33:30ID:???
>>521
手元の本に載ってなければマニュアルを読めばいいじゃない。
http://search.cpan.org/~nwclark/perl-5.8.7/pod/perlfunc.pod#sprintf

英語が苦手なら駱駝本を買えばいいじゃない。
>>7

> "%.4d/%.2d/%.2d" → 20050622 となるのはどうしてなんでしょうか
$year + 1900 を 4 桁の精度に丸めると 2005 、$mon + 1 を 2 桁の精度に
丸めて ( d は整数型指定子なので) 0 パディングすると 06 、$day を 2 桁
の精度に丸めると 22 、それぞれ当てはめて 2005/06/22

> "%.4d/%.2d/%.2d" は "%04d%02d%02d" に書き換えちゃってもかまわない
> でしょうか?

スラッシュが無くなっても構わないならご自由に。
0523nobodyさん2005/06/22(水) 15:55:25ID:pDQou/2T
cgiファイルのパーミッション設定をWS_ftpで755に変えようとすると。
Permission denied on server. (chmod)とでます。
その上のフォルダは変えられたのですが・・・
上記のエラーはどういう意味なんでしょうか?
05245212005/06/22(水) 16:18:22ID:???
>522
ありがとうございます。
URL先読んでだいぶ分かりました。

そして手元の本を見直したら、
「.」の後の数値の意味に「文字列の最大幅」というのがちゃんと載ってました。orz
「5.2」のように「.」には必ず前後に数値がないといけないと思い込んでしまってました。

>スラッシュが無くなっても構わないならご自由に。

そうですね、下はスラッシュを入れてますね。気がつかなかった・・・
これは
$day = sprintf("%04d%02d%02d", $year+1900, $mon+1,$day);
$day =~ s/(\d{4})(\d{2})(\d{2})/$1\/$2\/$3/;
とやっておこうと思います。

どうもありがとうございました。
0525nobodyさん2005/06/22(水) 16:51:26ID:???
>>523
初心者質問スレが無くなって不便だな…。代わりはここでいいんだろうか。

CGIとかPerlとか超初心者なんだけど、
http://pc8.2ch.net/test/read.cgi/php/995618200/

Perl に関係無い話は上記スレへ。

>>524
"%04d/%02d/%02d"
0526nobodyさん2005/06/22(水) 17:23:55ID:???
>>522 おまいおもしろいな。
0527nobodyさん2005/06/22(水) 17:53:22ID:???
>>524
hint:

sprintf("%04d%02d%02d", $year, $mon, $day); #20050622

sprintf("%04d/%02d/%02d", $year, $mon, $day); #2005/06/22

sprintf("%04d年%02d月%02d日", $year, $mon, $day); #2005年06月22日
0528nobodyさん2005/06/22(水) 18:12:51ID:???
>>524
hint:

$hoge = "ほげ〜ほげ〜ほげ〜<br>お〜れ〜は%s\<br>ガ〜キだいしょ〜うっとくらあ";
$hoge = sprintf($hoge, 'ジャイアン');
0529nobodyさん2005/06/22(水) 18:46:41ID:VvFC8JSF
my $edit_url = sprintf ("%s?choice=edit;id=%d", url (), $row->{id});
my $delete_url = sprintf ("%s?choice=delete;id=%d", url (), $row->{id});
print br (), br (),
"$row->{t} $row->{status}",
" [", a ({-href => $edit_url}, "Edit"), "]",
" [", a ({-href => $delete_url}, "Delete"), "]",
br (), "\n",
"$row->{content}\n";


1行目のsprintfで文字列を指定して、出力しているのはわかります。
しかし、括弧内の意味がわかりません。変数"id"について、URLを指定しているらしい
ですが、よくわかりません。
どっかに詳しく解説している、サイトとかありませんかね?
0530nobodyさん2005/06/22(水) 18:51:23ID:???
ネタか?
0531524,5212005/06/22(水) 19:10:41ID:???
ありゃ、みなさんありがとうございます。

ええと、わざわざ後からスラッシュを入れる方式(>524)にした理由は、

配布されてるあるCGIをカスタマイズしていたら、
そのCGIには日付を取得するサブルーチン(>521の上)があって
ほとんどの部分でそのサブルーチンを利用しているのに、
一カ所だけ利用していない(>521の下)部分があって、
どうしてこの部分では利用して無いのか?他と違うデータなのか?
というのが始まりだったんです。

ちなみにそのCGIの他の箇所で「2005/06/22」形式のデータが必要な時は、
サブルーチンで「20050622」形式のデータを取得した後
s/(\d{4})(\d{2})(\d{2})/$1\/$2\/$3/;
をやってましたので、それに揃えようかと。
0532nobodyさん2005/06/22(水) 21:23:12ID:SO7tDheg
突然すいません、CGI.pmって普通はどこに置くものなんですか?
OSはRedhatなんですけど
0533nobodyさん2005/06/22(水) 21:57:46ID:???
perl/lib
0534nobodyさん2005/06/23(木) 00:40:06ID:???
こんなプログラムを考えています。

・ID(10バイト程)を入力してもらう
・IDを受け取ったプログラムはIDを一行ごとに入力してある
 ファイルを順次読み込み(読みオンリーでオープン)
 該当するIDがあるかどうかチェックする。
 (対象のIDは5千件程度)

というWebを作りたいんですが、読み込みオンリーで
オープンしておけば一度に10人とか同じチェック側の
プログラムを動かしてもロックかかったりしてパフォーマンス
が落ちることはない?それともプログラム中で条件式(if?)
の中で固定でチェックした方がいいのでしょうか?
0535nobodyさん2005/06/23(木) 00:54:13ID:???
読みオンリーならロックかける必要なくない?
0536nobodyさん2005/06/23(木) 00:57:09ID:???
意味が良くわからないんだけど
0537nobodyさん2005/06/23(木) 01:09:28ID:???
>>534
読み出しだけならロック不要だが5000件あるなら
dbmとか使ったほうがいいんでない?
0538nobodyさん2005/06/23(木) 01:40:39ID:???
5000 * 10 約 50kb くらいか。 微妙だ。
0539nobodyさん2005/06/23(木) 01:58:38ID:dskomwuH
>>525
スレを教えてくれてありがとうございました
0540nobodyさん2005/06/23(木) 02:32:10ID:???
5000行程度のデータなら別に気にしなくてもよいのでは?
処理を速攻で終わらせてメモリを開放してあげるほうが重要かと。sleepとか使っちゃダメ。
・・・10人同時って、ほんとにそんな状況発生するのかな?
0541nobodyさん2005/06/23(木) 15:11:47ID:???
宜しくお願いします。
CGIを改造中なのですが、知恵を貸してください。

ログの情報を「○番目の要素でソートして表示する」と言うのをしたいのですが、うまくできません。
他のCGIからソート部分だろうと思われるものをコピッて手を加えたのですが、ダメです。

open(IN,"$logfile") || &error("Open Error : $logfile");
@data = <IN>;
close(IN);
@tmp = map {(split /<>/)[3]} @data;
@slist = @data[sort {$tmp[$b] cmp $tmp[$a]} 0 .. $#tmp];
 $i=0;
 $flag=0;
 while (@slist) {
  ($no,$date,$name,$genre,$com,$kousi,$day,$w1,$w2,$w3,$w4,$w5,$w6,$w7,$time,$mony,$tail,$w,$h) = split(/<>/);

---------
$genreにソートしたいもの(g_1,g_2,g_3〜)が入っていて、それを元に並べ替えしたいんです。
この状態で動作させると、変数が入っていない表が無限に続いてしまいます。

どこが間違っているのでしょうか? お願いします。

0542nobodyさん2005/06/23(木) 16:03:51ID:???
>>541
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_do_I_sort_an_array_by_anyth

★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1077525387/

【 スクリプト改造依頼スレ 】(丸投げ) part3
http://pc8.2ch.net/test/read.cgi/php/1105046286/
0543nobodyさん2005/06/23(木) 16:06:01ID:AbvQdhd4
cgi.pmを使用して以下のようにクッキーを取得しました。

use CGI;

$cookie = $cgi->cookie(-name => 'hoge',
            -value => 'fuga',
            -expires => '+1h',
);
print $cgi->header(-cookie=>$cookie);

この結果は
Set-Cookie: hoge=fuga; path=/; expires=Thu, 23-Jun-2005 07:21:10 GMT Date: Thu, 23 Jun 2005 06:21:10 GMT Content-Type: text/html; charset=ISO-8859-1
のようになりうまくクッキーを取得したようです。


しかし、上のクッキーを取得するために
print $cookie = $cgi->cookie(-name=>'hoge');
と記述しましたが、何も値が入ってませんでした。


cgi.pmを使用してクッキーを取得するにはどのようにしたらよいのでしょうか
0544nobodyさん2005/06/23(木) 17:34:51ID:???
>>543
<q cite="http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod">
クッキーを取り出すには、cookie()メソッドを-valueパラメータなしで
呼び出すことによって名前で要求します:

  use CGI;
  $query = new CGI;
  $riddle = $query->cookie('riddle_name');
     %answers = $query->cookie('answers');
</q>
0545nobodyさん2005/06/23(木) 18:34:57ID:???
>>544
どうでもいいけど、 q じゃなくて blockquote のような。
0546nobodyさん2005/06/23(木) 20:57:35ID:???
q でも間違いじゃないよ。インラインだし。
原文が段落あるんだろうから、blockquote のがいいけど。
blockquote だと p とか pre とかも入れないといけないけど。
0547nobodyさん2005/06/23(木) 22:19:04ID:???
>>534
まぁ5000件くらいじゃ大丈夫だと思う。
もっと多い場合の対処法としては

データファイルをソートしておく→IDが存在しない時早く終れる。
IDの頭文字別にデータファイルを用意する→個々のデータファイルが小さくなるから早く処理が終わる。
0548nobodyさん2005/06/24(金) 05:19:50ID:kge0P1YB
こんにちは。
他の方が製作したCGIに次のような記述がありました。

$\ = "\n";
print "<html>";
print "<body>";
print "<p>test</p>";
print "</body>";
print "</html>";
$\ = "";

これの最初の $\ = "\n"; についての質問です。
これは、恐らくHTMLソースの改行が目的であることは分かりますが、
$\ とはどういった変数なのでしょうか?
また、同じように使える特殊な変数はあるのでしょうか?

検索エンジンで必死に調べたのですが、「$\」で絞り込むのは厳しいようで…。

ご教示お願いします。
0549nobodyさん2005/06/24(金) 05:36:55ID:???
>>548
perlvar
0550nobodyさん2005/06/24(金) 09:01:17ID:???
>>548
ttp://www.rfs.jp/sitebuilder/perl/02/nw01.html
0551nobodyさん2005/06/24(金) 09:04:39ID:???
>>548
printで末尾に出力するものを指定できる
0552nobodyさん2005/06/24(金) 12:27:48ID:QTITokL2
動的なhtmlページをダウンロードしたいので教えて下さい。

掲示板などのようにcgiやphpなどで動的に表示が変わるページを
ページが表示されてからソースの表示をした時に見られるような
htmlソースでダウンロードしたいのですが、やり方がわかりません。
また、niftyのサーバで動かしたいので特殊なモジュールも使用できないので
それでも可能な方法があれば教えて下さい。

本当にやりたい事はその先で、そのソースをまたperlで解析して
テキストを表示するというものです。
ダウンロードしたファイルからそのテキストをただ表示する部分は出来ているので
ダウンロードの部分を教えて下さい。

宜しくお願いします。
0553nobodyさん2005/06/24(金) 12:41:15ID:???
http://pc.2ch.net/php/kako/1034/10345/1034583844.html>>991
>WEBページを読み込みたいのですが可能でしょうか?

http://pc.2ch.net/php/kako/1037/10377/1037797479.html>>5
>前すれ>>991
>Socketを使わないとむりぽ。
>がむばってネ。


がむばってネ。


おとなしくLWPとか使うのがいいんだけど。niftyなんぞ無視して。
http://pc.2ch.net/php/kako/1037/10377/1037797479.html>>9
>LWP::Simpleモジュールが入っているなら
>perldoc lwpcookして出てくる文書読んでみるとやり方出てるよ。
>
>use LWP::Simple;
>getstore "http//:www.yahoo.co.jp", "yahoo.html";
>みたいな感じ。


がむばってネ。
0554nobodyさん2005/06/24(金) 13:17:47ID:???
説明が分かりにくすぎ。
まじめな話、もう少し日本語を勉強せよ
0555nobodyさん2005/06/24(金) 15:58:04ID:/NGYg1v6
>>553
LWP::Simpleモジュールも入っていないようです。

自PCでActiveperlを実行した時は
HTTP::Lite;モジュールを使ったのですが、
これもNiftyでは使えないようです。
0556nobodyさん2005/06/24(金) 16:01:15ID:???
Niftyは何の標準モジュールも故意に消されているので、使いたい場合は自分で用意する必要がある、って誰かが言ってたじゃあないか。
ということで使いたきゃ自分で必要なもの全部揃えてアップして使いなさい。
05575482005/06/24(金) 17:18:12ID:???
>>549-551
ご回答ありがとうございました。
Perlの特殊変数のページ非常に参考になりました。
難しくて全てを理解するまでは時間がかかりそうですが、
とりあえず気になったことが分かって嬉しいです。
0558あ2005/06/24(金) 17:24:31ID:L251Ppfj
超基本ですいません。
パッケージ内でグローバルな宣言をされた変数って、それぞれ別にNewで生成されたオブジェクト変数ごとで固有に持たせる方法はありますか?
$a = new foo;
$b = new foo;
fooは内部のmyグローバル変数 s をもってて、set メソッドで代入しgetメソッドで取り出せるとします。
$a->set(100);
$b->set(200);
とすると、
print $a->get;
で 200 と返ってきてしまいます…
javaそのほかのようにインスタンスごとの固有値は持たせられないのでしょうか?基本的で申し訳ありませんがよろしくご教授ください。
0559nobodyさん2005/06/24(金) 17:25:44ID:???
すいません。
初歩的な質問宜しいでしょうか?

perlで文字列の長さを取得する関数って
ないのでしょうか?

my $len = strlen('auaua');
       ^^^^^こんなの、、、
0560nobodyさん2005/06/24(金) 17:31:04ID:???
length
0561nobodyさん2005/06/24(金) 17:42:52ID:???
>>558
> myグローバル変数
そりゃグローバル変数だからだ。
05625592005/06/24(金) 17:46:00ID:???
>560さん
わーい
本当にありがとーございますっ
0563あ2005/06/24(金) 18:01:45ID:L251Ppfj
>>561
言い方が変でした。すいません。
ようは、パッケージのインスタンスごとに、変数値を持たせられる方法が知りたいのです。同一のパッケージから生成したインスタンスごとでも
$a->get ⇒ 100
$b->get ⇒ 200
のようにできるコーディングがどうすればいいかわかりません…
Perlではこのような動作の要求は無理なんでしょうか?
0564nobodyさん2005/06/24(金) 18:13:32ID:???
>>563
perl クラス インスタンス
でググって、三つ目くらいにある「Perlでオブジェクト指向」みてみそ。
0565nobodyさん2005/06/24(金) 18:16:40ID:???
>>548ってヒアドキュメントとか使ったほうがよくないか?そうでもない?
0566nobodyさん2005/06/24(金) 18:20:36ID:???
sub new {
 my $class = shift;
 my $self = {};
 bless ($self, $class);
}
sub set {
 my $self = shift;
 $self->{s} = shift;
}
sub get {
 my $self = shift;
 return $self->{s};
}
05675632005/06/24(金) 18:26:07ID:???
皆様ありがとうございます!糸口つかめました!
ケータイからのカキコで必死だったためろくにsageませんでした;;
なるほどです。感謝!
0568nobodyさん2005/06/24(金) 18:26:58ID:???
>>565
ヒアドキュメントの見た目が嫌いな人だったりして
0569nobodyさん2005/06/24(金) 18:32:24ID:???
なんでそんなどうでもいい話を発展させるんだ?
0570nobodyさん2005/06/24(金) 18:32:49ID:???
すいません質問があります。

始めの一文字が同じならtrueとしたいのですが
そのような関数もしくはやり方等ないのでしょうか?

昔
if( ($abc cmp $def) >1 ){:
このようなコード書いたような記憶はあるのですが、、、
0571nobodyさん2005/06/24(金) 18:39:48ID:???
今日は初心者以前の質問が多いような・・・。

if (substr ($abc, 0 , 1) eq substr ($def, 0 , 1)) { 〜 }
0572nobodyさん2005/06/24(金) 21:10:46ID:???
どっかでperlクイズのような宿題でも出たか?
0573nobodyさん2005/06/25(土) 00:44:36ID:???
println "aaa";って欲しいな。
0574nobodyさん2005/06/25(土) 01:22:00ID:???
それ自分で作ってやってるw

でもそれでファイルには書けないんだけどさ。
0575nobodyさん2005/06/25(土) 01:29:56ID:???
何言ってんだこのバカ
0576nobodyさん2005/06/25(土) 02:58:57ID:???
お世話になります。

cgi-lib.plのReadParseで読み込んだデータ
$in{'hoge'} (中身はチェックボックスで選択された複数のデータが入っています)があります。

print $in{'hoge'};とすると

あああ いいい ううう えええ おおお かかか ききき くくく・・・のように半角スペース区切りのデータが出ますが、

これを

あああ・いいい・ううう(改行)
えええ・おおお・かかか(改行)
ききき・くくく

のように、3の倍数個目のデータには改行を、それ以外には中黒「・」で区切るようにして表示したいのです。
単純に区切り文字を他の文字に全て置き換えすることなら出来るのですが、ちょっと複雑になるとお手上げです。

ご教示よろしくお願いします。
0577nobodyさん2005/06/25(土) 03:06:46ID:VyiiD8SR
0x00で区切られない?
半角スペース区切りだっけ?

普通に split して for文使うとかはどうよ
0578nobodyさん2005/06/25(土) 03:57:59ID:???
>>576
例えば、区切りとしてじゃなく、各データのケツに改行とか中黒が着いてると考える。
つまり「3の倍数個目か」「最後のデータか」「それ以外」かで後ろに何をprintするか分岐したらいい。
ループの中にif文2個書いてもいいし、最後だけが例外的なのを利用してループが最後のデータ直前で終わるようにしてもいい。
0579nobodyさん2005/06/25(土) 04:46:44ID:???
あとは、
$_ = "あああ\0いいい\0ううう\0えええ\0おおお\0かかか\0ききき\0くくく";
while (/([^\0]*)\0([^\0]*)\0?([^\0]*)\0?/g) {
    print $1, ($2 ne '' && '・'. $2), ($3 ne '' && '・'. $3), "\n";
}
とかな。
0580nobodyさん2005/06/25(土) 05:24:23ID:???
print join("・", split /\0/), "\n" for m/(?:[^\0]+\0?){3}/g;
0581nobodyさん2005/06/25(土) 14:43:44ID:???
すみません、Net:CIDR:Liteモジュールはどこで落とせばいいですか?
0582nobodyさん2005/06/25(土) 15:04:05ID:???
失礼しました、CPANから落とせました。
連続で申し訳ありませんが、これを実行すると
Can't use string ("") as a subroutine ref while "strict refs" at 〜
となってしまいます。find()をするとこうなるのですが、どこがおかしいのですか?

use Net::CIDR::Lite;
my $net = Net::CIDR::Lite->new;
my @airedgecidr = (
'221.119.8.0/24', '221.119.9.0/24'
);
foreach (@airedgcidr) {
$net->add($_);
}
$result = $net->find('221.119.8.1');
0583nobodyさん2005/06/25(土) 15:09:40ID:???
>>582
ttp://perldoc.jp/docs/perl/5.8.1/strict.pod
0584nobodyさん2005/06/25(土) 15:20:19ID:???
>>583
!
use strictしたところ、配列の変数名が間違っていることに気づきましたorz
ありがとうございました。
# rootさんのソースなのに…
0585nobodyさん2005/06/25(土) 15:29:33ID:???
んなもん誰にでもミスはあるさ
05865762005/06/25(土) 20:03:10ID:???
ありがとうございました。

>>579のソースが私的にわかりやすかったので、使わせていただきます。
0587nobodyさん2005/06/26(日) 03:21:28ID:???
教えて下さい
レンタルの日記を借りて、スキンを使ったのですが画像を投稿出来ないので
自分でスキンのタグを変更可能してもおkと書いてあったので
画像を無理やり出すイレギュラーってのをやりたいのですが
何を挿入していいか分かりません・・。
画像投稿可版・不可版(同スキン)を両方DLしてソースを見比べたのですが
どうしても分らず、ぐぐっても分りませんでした・・。
どんなタグ?をどの辺りに挿入すればいいのか教えてもらえませんか・・?
よろしくお願いします。
(どこで聞いていいか分からなかったのでスレ違いだったらすみません・・)
05885872005/06/26(日) 03:24:35ID:???
すみません、初心者で検索かけたのでスレ違いに今気づきました・・。
他で聞いて来ます。
申し訳ありませんでした・・。
0589nobodyさん2005/06/26(日) 23:02:23ID:3dNr93yG
下記のSOCKET通信プログラムにて画像を取得しているのですが、サーバによって
print SOCKET "User-Agent: " . $browser . "\n";
で止まってしまうものがあるようです。

モジュールが入っていることは確認できているのですが、もしも
なにかお気付きの点等ございましたらご教示いただきたく思って
おります。どうか宜しくお願いいたします。


use Socket;
use FileHandle;
my $ip = inet_aton($host) || die "host($host) not found.\n";
my $sockaddr = pack_sockaddr_in($port, $ip);
socket(SOCKET, PF_INET, SOCK_STREAM, 0) || die "socket error.\n";
connect(SOCKET, $sockaddr) || die "connect $host error.\n";
autoflush SOCKET (1);
binmode(STDOUT);
print SOCKET "GET $directory$filename HTTP/1.1\n";
print SOCKET "User-Agent: " . $browser . "\n";
print SOCKET "Host: " . $host . "\n";
print SOCKET "Connection: close\n\n";
while(<SOCKET>){
m/^Content-Type: ([^\r\n]+)/i && print "Content-Type: $1\r\n";
m/^Content-Length: ([^\r\n]+)/i && print "Content-Length: $1\r\n";
m/^\r\n$/ && last;
}
print "\r\n";
while(<SOCKET>){
print $_;
}
close(SOCKET);
0590nobodyさん2005/06/26(日) 23:41:10ID:???
>>589
なんで
> print SOCKET "User-Agent: " . $browser . "\n";
で止まってるって思ったの?
0591nobodyさん2005/06/27(月) 01:10:18ID:???
俺もそれ聞こうと思ってた
0592nobodyさん2005/06/27(月) 01:29:08ID:???
perlのコーディングを楽にするために、
HTMLの記述をprint "〜"に変換する作業を一括で行うソフトウェアを探しているのですが、そのようなソフトはありますか?

例えば、
<a href="abc.html">ABC</a>
を
print "<a href=\"abc.html\">ABC</a>"
と変換できるものです。
0593nobodyさん2005/06/27(月) 01:37:26ID:???
なんていうか、ヒアドキュメントとかqqとか知ってる?
■ このスレッドは過去ログ倉庫に格納されています