Perlコーディング初心者質問スレ Part 42
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/05/25(水) 06:36:28ID:PVpWgcdf【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0546nobodyさん
2005/06/23(木) 20:57:35ID:???原文が段落あるんだろうから、blockquote のがいいけど。
blockquote だと p とか pre とかも入れないといけないけど。
0547nobodyさん
2005/06/23(木) 22:19:04ID:???まぁ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ソースの改行が目的であることは分かりますが、
$\ とはどういった変数なのでしょうか?
また、同じように使える特殊な変数はあるのでしょうか?
検索エンジンで必死に調べたのですが、「$\」で絞り込むのは厳しいようで…。
ご教示お願いします。
0552nobodyさん
2005/06/24(金) 12:27:48ID:QTITokL2掲示板などのようにcgiやphpなどで動的に表示が変わるページを
ページが表示されてからソースの表示をした時に見られるような
htmlソースでダウンロードしたいのですが、やり方がわかりません。
また、niftyのサーバで動かしたいので特殊なモジュールも使用できないので
それでも可能な方法があれば教えて下さい。
本当にやりたい事はその先で、そのソースをまたperlで解析して
テキストを表示するというものです。
ダウンロードしたファイルからそのテキストをただ表示する部分は出来ているので
ダウンロードの部分を教えて下さい。
宜しくお願いします。
0553nobodyさん
2005/06/24(金) 12:41:15ID:???>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:/NGYg1v6LWP::Simpleモジュールも入っていないようです。
自PCでActiveperlを実行した時は
HTTP::Lite;モジュールを使ったのですが、
これもNiftyでは使えないようです。
0556nobodyさん
2005/06/24(金) 16:01:15ID:???ということで使いたきゃ自分で必要なもの全部揃えてアップして使いなさい。
0557548
2005/06/24(金) 17:18:12ID:???ご回答ありがとうございました。
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:???0562559
2005/06/24(金) 17:46:00ID:???わーい
本当にありがとーございますっ
0563あ
2005/06/24(金) 18:01:45ID:L251Ppfj言い方が変でした。すいません。
ようは、パッケージのインスタンスごとに、変数値を持たせられる方法が知りたいのです。同一のパッケージから生成したインスタンスごとでも
$a->get ⇒ 100
$b->get ⇒ 200
のようにできるコーディングがどうすればいいかわかりません…
Perlではこのような動作の要求は無理なんでしょうか?
0566nobodyさん
2005/06/24(金) 18:20:36ID:???my $class = shift;
my $self = {};
bless ($self, $class);
}
sub set {
my $self = shift;
$self->{s} = shift;
}
sub get {
my $self = shift;
return $self->{s};
}
0567563
2005/06/24(金) 18:26:07ID:???ケータイからのカキコで必死だったためろくにsageませんでした;;
なるほどです。感謝!
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:???0573nobodyさん
2005/06/25(土) 00:44:36ID:???0574nobodyさん
2005/06/25(土) 01:22:00ID:???でもそれでファイルには書けないんだけどさ。
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半角スペース区切りだっけ?
普通に split して for文使うとかはどうよ
0578nobodyさん
2005/06/25(土) 03:57:59ID:???例えば、区切りとしてじゃなく、各データのケツに改行とか中黒が着いてると考える。
つまり「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:???0581nobodyさん
2005/06/25(土) 14:43:44ID:???0582nobodyさん
2005/06/25(土) 15:04:05ID:???連続で申し訳ありませんが、これを実行すると
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');
0584nobodyさん
2005/06/25(土) 15:20:19ID:???!
use strictしたところ、配列の変数名が間違っていることに気づきましたorz
ありがとうございました。
# rootさんのソースなのに…
0585nobodyさん
2005/06/25(土) 15:29:33ID:???0587nobodyさん
2005/06/26(日) 03:21:28ID:???レンタルの日記を借りて、スキンを使ったのですが画像を投稿出来ないので
自分でスキンのタグを変更可能してもおkと書いてあったので
画像を無理やり出すイレギュラーってのをやりたいのですが
何を挿入していいか分かりません・・。
画像投稿可版・不可版(同スキン)を両方DLしてソースを見比べたのですが
どうしても分らず、ぐぐっても分りませんでした・・。
どんなタグ?をどの辺りに挿入すればいいのか教えてもらえませんか・・?
よろしくお願いします。
(どこで聞いていいか分からなかったのでスレ違いだったらすみません・・)
0588587
2005/06/26(日) 03:24:35ID:???他で聞いて来ます。
申し訳ありませんでした・・。
0589nobodyさん
2005/06/26(日) 23:02:23ID:3dNr93yGprint 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:???なんで
> print SOCKET "User-Agent: " . $browser . "\n";
で止まってるって思ったの?
0591nobodyさん
2005/06/27(月) 01:10:18ID:???0592nobodyさん
2005/06/27(月) 01:29:08ID:???HTMLの記述をprint "〜"に変換する作業を一括で行うソフトウェアを探しているのですが、そのようなソフトはありますか?
例えば、
<a href="abc.html">ABC</a>
を
print "<a href=\"abc.html\">ABC</a>"
と変換できるものです。
0593nobodyさん
2005/06/27(月) 01:37:26ID:???0594nobodyさん
2005/06/27(月) 01:44:19ID:???そんな方法があったんですか・・・・。今日はじめた初心者だったのでごめんなさい。
>>593さんありがとう('A`)
0596nobodyさん
2005/06/27(月) 02:14:33ID:???0597nobodyさん
2005/06/27(月) 02:18:26ID:???0598nobodyさん
2005/06/27(月) 02:28:57ID:???ご返答有難うございます。
止まっていると思ったのは、
print SOCKET "User-Agent: " . $browser . "\n";
print SOCKET "Host: " . $host . "\n";
を外したら進んだためです。
具体的には、KeitaiPicutureという画像変換サービスで変換された
画像をSOCKETでとってくる仕組みを作っているのですが、
GET $directory$filename?User-Agent=UA
だと成功するんですよね。
とにかくご教示有難うございました。
0599nobodyさん
2005/06/27(月) 03:10:20ID:???そのサービスが$ENV{HTTP_USER_AGENT}じゃなくてクエリーのUser-Agentを見てるからだろ。
0601nobodyさん
2005/06/27(月) 08:08:58ID:7ZY2M4BI0602nobodyさん
2005/06/28(火) 16:25:00ID:l0OJ7VtDuse HTTP::Request;
use LWP::UserAgent;
my $url = 'http://www.yahoo.co.jp';
my $request = HTTP::Request->new(GET => $url);
my $ua = LWP::UserAgent->new;
my $response = $ua->request($request);
if($response->is_success) {
print $response->content;
} else {
print $response->status_line;
}
という LWP::UserAgent をテストするためのCGIを、サンプルを元に組んだのですが、
[Tue Jun 28 15:42:43 2005] [error] Premature end of script headers:
ということで 500 Internal Server Error になってしまいます。
Premeture〜ってぐぐってみたけどよくわかりません。
原因として何が考えられますか?
0603nobodyさん
2005/06/28(火) 16:52:11ID:???0606nobodyさん
2005/06/28(火) 17:58:49ID:???--------------------------------
my %dir_name=();
readDir(\@dir_name);
sub readDir{
my $dirname_ref = shift;
$dirname_ref->{'aaa'}="BBB";
}
--------------------------------
を実行しても
Can't coerce array into hash at cron_day_table.cgi line 50.
とエラーになってしまいます。
何がいけないのでしょうか?
ご助力を頂けますと助かります。
0608606
2005/06/28(火) 18:17:44ID:???本当だー
ありがとーございますっ
スレ汚し失礼いたしました。
0609606
2005/06/28(火) 19:37:41ID:???my %dir_name=();
my $dirname_ref = \%dir_name;
$dirname_ref->{'bbb'}='hoge';
$dirname_ref->{'ccc'}='hoge';
$dirname_ref->{'aaa'}='hoge';
my $key;
foreach $key(keys %dir_name){
print "$key -> $dir_name{$key}\n";
}
--------------------------------
として出力すると↓
--------------------------------
bbb -> hoge
aaa -> hoge
ccc -> hoge
--------------------------------
のようになってしまいます。
下記のように入れた順番通りに出力したいのですが
bbb -> hoge
ccc -> hoge
aaa -> hoge
そういった場合はどうすればよろしいのでしょうか?
ご助力を頂けますと助かります。
0610nobodyさん
2005/06/28(火) 19:44:18ID:???http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_keys_HASH
0611nobodyさん
2005/06/28(火) 19:46:11ID:???もしかして、無かったことになった?
0612nobodyさん
2005/06/28(火) 19:52:27ID:???http://search.cpan.org/~nwclark/perl-5.8.7/pod/perl58delta.pod#Deprecations
0614nobodyさん
2005/06/28(火) 21:58:10ID:???0615nobodyさん
2005/06/29(水) 20:47:26ID:???スマートじゃないけど。
my %dir_name=();
my $dirname_ref = \%dir_name;
$dirname_ref->{'bbb'} = ['hoge', 1];
$dirname_ref->{'ccc'} = ['hoge', 2];
$dirname_ref->{'aaa'} = ['hoge', 3];
foreach my $dir (sort{$a->[1]->[1] <=> $b->[1]->[1]} map{ [$_, $dir_name{$_}] } keys %dir_name){
print "$dir->[0] -> $dir->[1]->[0]\n";
}
0617nobodyさん
2005/06/29(水) 23:40:40ID:4HgpqCXdどうしてこれで "0_" と表示できないのか教えて下さい。
$i = 0;
print "$i_\n";
0619617
2005/06/30(木) 00:06:48ID:nq4lXHpHここでのアンダースコアはどのように効いているのでしょうか?
否定の演算子でもなさそうなのですが・・・
0622nobodyさん
2005/06/30(木) 01:13:28ID:8FYD6O0q簡単なの持っててもえーかな思ったんだけど、チェックボックスとかの複数選択がどーにもできんのです。。
複数のバリュあるときは配列にするのなら、
if (defined $form{$key}){
if(ref $form{$key}){ push @$key,$value; }
else{ @$key=($form{$key},$value); $form{$key}=\@$key; }
}
うろ覚えで書いたんで変かも・・・っていうか、@$keyがおかしいケド。こんな感じで良いのでしょうか?
プログラムそのものもperlが初めてなんで要領得なくて
サブルーチン内外で変数共有しない方がいいのかと思ったんだけど、リファレンスする配列が局所化できません。
0623nobodyさん
2005/06/30(木) 01:17:33ID:???参考にしたスクリプトで使われてたcgi-liteだかではそうなってたような気が。
そして、sageってシステムがよくわからない・・・申し訳ないです。
0624nobodyさん
2005/06/30(木) 02:47:40ID:???push @{$form{$key}},$value;
リファレンスするならこんな感じかの。
push @{$$form{$key}},$value;
でも、別に配列にこだわらなくてもいい気がする。
0625606
2005/06/30(木) 11:45:29ID:???本当にみなさんRESありがとうございます。
順番を保持する配列とその配列の要素をキーとするハッシュで
やる方法で自作し強引に解決(?)いたしました。
本当にRESどうもですっ
そのうちこちらで解決案を書ける人になれますようがんばりますですっ
0627nobodyさん
2005/06/30(木) 13:17:05ID:wTRNDiAZ&decrypt(入力されたパスワード、登録されてるパスワード)
sub decrypt {
local($in, $dec) = @_;
local $salt = $dec =~ /^\$1\$(.*)\$/ && $1 || substr($dec, 0, 2);
if (crypt($in, $salt) eq $dec || crypt($in, '$1$' . $salt) eq $dec) {
return (1);
} else {
return (0);
}
}
パスワード認証のサンプルなんですけど、
入力されたパスワードが認証されれば1を間違っていれば0を返すサブルーチンなんですが、
local $salt = $dec =~ /^\$1\$(.*)\$/ && $1 || substr($dec, 0, 2);
if (crypt($in, $salt) eq $dec || crypt($in, '$1$' . $salt) eq $dec) {
↑の部分がどうしてもわからないのですが御教授お願いします。
0628nobodyさん
2005/06/30(木) 13:22:47ID:???crypt() の仕組みが理解できてないとキツいと思うので、
「crypt パスワード」あたりでぐぐって調べてみるのが良いと思う。
0629nobodyさん
2005/06/30(木) 14:05:04ID:wTRNDiAZありがとうございます。crypt()は勘違いして覚えてました。
変換キーに2文字じゃなきゃいけないんですね。
それで
substr($dec, 0, 2);
の意味はわかったんですが
$dec =~ /^\$1\$(.*)\$/ && $1
と
crypt($in, '$1$' . $salt) eq $dec
の部分がまだわからないのですが
お願いします。
0630nobodyさん
2005/06/30(木) 15:18:51ID:???# - - - - - - - - - - - -
$salt = $dec =~ /^\$1\$(.*)\$/ && $1
||
if (
length $dec >= 3 &&
substr($dec, 0, 2) eq '$1$' &&
substr($dec, -1, 1) eq '$'
) {
$salt =
substr($dec, 2);
chop $salt
;
}
# - - - - - - - - - - - -
if (crypt($in, '$1$' . $salt) eq $dec)
||
my $tmp = '$1$' . $salt;
if (crypt($in, $tmp) eq $dec)
# - - - - - - - - - - - -
とりあえず正規表現学んで来い、といいたい。
作者が $1$ *** $ とつけてるのはよくわからない。
0631nobodyさん
2005/06/30(木) 15:19:50ID:???0632nobodyさん
2005/06/30(木) 16:24:04ID:???0633nobodyさん
2005/06/30(木) 16:30:42ID:wTRNDiAZありがとうございます。
一行づつなら理解できるのですが、
$dec =~ /^\$1\$(.*)\$/
↑この表現は変数$decの頭が $1$ で任意の文字がいくつか入って
その後 $ の文字列にマッチするか否かと理解していいんでしょうか?
$1$ これって特別な意味あるんですか?
local $salt = $dec =~ /^\$1\$(.*)\$/ && $1 || substr($dec, 0, 2);
あと上の処理の順番がよくわらないんですが
A && B Aが真ならBを実行
A || B Aが偽ならBを実行
と言うのならわかるのですが
その辺もご教授願えないでしょうか
一応本を見ながらやっているのですがイマイチ理解できません。
0634nobodyさん
2005/06/30(木) 16:41:02ID:???sub decrypt {
crypt($_[0], $_[1]) eq $_[1];
}
0635nobodyさん
2005/06/30(木) 16:59:34ID:???$in{race}="aa";
$raceindex="bb";
if($in{race} == $raceindex){print "ok";}
exit;
これを実行すると$in{race}の内容と$raceindexの内容は同じではないはずなのに
if分は真となってokと表示されます
これはif分の書き方がおかしいのでしょうか
0636nobodyさん
2005/06/30(木) 17:07:01ID:???== は数値で評価する演算子。
この場合はどっちも 0 と評価されるので真になってしまう。
文字列を比較したい場合は eq 演算子を使う。
perlop - Perl operators and precedence (Perl の演算子と優先順位)
ttp://perldoc.jp/docs/perl/5.6.1/perlop.pod
0637nobodyさん
2005/06/30(木) 17:13:09ID:???有難う御座います
perlのスクリプト書くの1年ぶりですっかり忘れてました
無事解決しました
有難う御座いました
0638nobodyさん
2005/06/30(木) 17:39:09ID:???サーバからsendmailの使用は許可されているのですが、どうやったらメールが来たことが検出できるのかまるでわからないのです。
申し訳ありませんが一手ご教授下さいくださいですよ
0639nobodyさん
2005/06/30(木) 17:42:21ID:???$1$で始まるのはMD5でハッシュ化された文字列です
$1$から次の$までの文字列がハッシュ化のsaltになります
そのサブルーチンはDESとMD5の両方使えるようにしているようだけど意味無いと思われます
DES,MD5どっちを使うかはcrypt関数が知っておりsaltも自動的に判断されるので>>634で十分です。
0640わから〜ん
2005/06/30(木) 19:18:36ID:UYjObKP/2行目 my $delete_url = sprintf ("%s?choice=delete;id=%d", url (), $row->{id});
3行目 print br (), br (),
4行目 "$row->{t} $row->{status}",
5行目 " [", a ({-href => $edit_url}, "Edit"), "]",
6行目 " [", a ({-href => $delete_url}, "Delete"), "]",
7行目 br (), "\n",
8行目 "$row->{content}\n";
1行目の sprinfで整形された文字列 my $edit_url変数に代入される。
2行目も同じ要領で、my $delet_url変数に代入される。
3行目は HTML表示
4行目 意味不明
5行目 1行目の変数が"edit"としてURL表示される。
6行目 2行目の変数が"delete"としてURL表示される。
7行目 HTML表示
8行目 意味不明
ご質問いたします。
(1)4行目の意味がわからない
(2)5行目と6行目がなぜ、editとdeleteのURL表示となるのか?
(3)8行目の意味がわからない
特に、(2)の質問を詳しく解説してください。(2)の用法について
ラクダ本に記述がありますか?
よろしくお願いいたします。
0641nobodyさん
2005/06/30(木) 19:24:59ID:???0643nobodyさん
2005/06/30(木) 19:59:14ID:???0644わから〜ん
2005/06/30(木) 20:11:02ID:UYjObKP/必死にいろんな本読んでも、記述が無いわけですね。
URLのところを読んで、勉強します。
大変ありがとうございました。
■ このスレッドは過去ログ倉庫に格納されています