Perlコーディング初心者質問スレ Part 41
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/03/10 00:47:16ID:sT66OcmD【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0755nobodyさん
2005/05/07(土) 02:12:00ID:???(Perl的にやってもいいのでしょうか)
具体的には
open(A, 'test.txt');
〜何らかの処理
open(B, 'test.txt');
〜何らかの処理
close(B);
〜何らかの処理
close(A);
のようなことです。
0756nobodyさん
2005/05/07(土) 02:13:47ID:???カウントされないようにBRL04-aで取得したWANがわのIPアドレスを取得したいのですが、どうすればよいですか?
とりあえず、DNSで正引きしてみたけどダメでした。
CGIで使うのでPerlで作りたいのです。
0757nobodyさん
2005/05/07(土) 02:38:42ID:???全部が読み取りなら可能。そういうことをやるべきかどうかは知らんが。
>>756
ルータの取得したWAN側アドレスはルータに聞くしかない。
SNMPでMIBを叩くのが筋だとは思うが、BRL-04はSNMPをサポートしてないよな。
BRL-04の設定画面をLWPで叩いてHTMLの中からWAN側アドレス表示のとこだけを抜き出す、
というのがたぶん現実的だろう。
0758nobodyさん
2005/05/07(土) 03:21:03ID:???('A`)
0759nobodyさん
2005/05/07(土) 15:07:18ID:???習作でサーバーに保存した一次ファイルを偽セッションとして使い、
perlだけでの認証制の掲示板を作ろうとしています。
とりあえずパッケージsession.plはできたんですが、ここで疑問が…
htmlのmetaヘッダで$permission = "<meta name='robots' content='noindex'>\n";の指定は出来るようにしてあるんですが、
これだけでログの外部流出は防げるんでしょうか?
もちろん普通に見た場合はsession見てイレギュラーなアクセスは弾くようにするつもりですが、
googleなどのキャッシュに引っかからないかどうかがわからないんです。
0760nobodyさん
2005/05/07(土) 15:24:38ID:???一次ファイル(ってなんだか知らんが)そのものを見られなくしよう
0761nobodyさん
2005/05/07(土) 15:45:32ID:???一時ファイルです。
当然ログファイル等はサーバーの権限設定で見られなくするつもりですが、、
そうではなくてログを暗号化するとか、そういう話でしょうか?
0762nobodyさん
2005/05/07(土) 15:58:59ID:???うぅすみません、いまいち意味がわからないです。
例えば.htaccessで弾いた場合、googleのキャッシュには絶対に引っかからないんでしょうか。
0763nobodyさん
2005/05/07(土) 16:03:27ID:???ハッシュの中身を別ファイルから読み込ませる方法ってありますか?
例えば
addr.txtの中に、以下の3行だけがあったものとして
aaa,[email protected]
bbb,[email protected]
ccc,[email protected]
(カンマ区切り)
これを
addr.cgiの中で
%addr_list = (
'aaa' => '[email protected]',
'bbb' => '[email protected]',
'ccc' => '[email protected]',
);
っていうふうに。@が入るのでシングルクォーテーションで括りたいです。
0764nobodyさん
2005/05/07(土) 16:08:06ID:???my @tmp;
while (<FILE>) {
@tmp = split ',', $_;
$addr_list{$tmp[0]} = $tmp[1];
}
0766nobodyさん
2005/05/07(土) 16:39:07ID:???ありがとうございます。
ログではなく、表示するページ(データから動的に生成&偽セッションでアクセス制限)でも
同じ事なのでしょうか。
0768nobodyさん
2005/05/07(土) 17:09:19ID:4STWB1kowwwwwwwwwwwwおkwwwおkwwwっっっうぇ
っうぇっうぇっうぇwwwwwwwwwうぇwww
おkwwwっうぇうぇwwwうぇwwwwwwっうぇ
0772nobodyさん
2005/05/08(日) 02:25:33ID:EhQFLRWQperlには多次元配列ってありますか?ないのなら代わりになるものってありますか?
0773nobodyさん
2005/05/08(日) 02:27:51ID:???http://www.google.co.jp/search?q=perl+%E5%A4%9A%E6%AC%A1%E5%85%83%E9%85%8D%E5%88%97
0774nobodyさん
2005/05/08(日) 02:40:55ID:???俺いっつも↓みたいな感じでやってた
@a = (0,1,2,3,4,5);
@b = (0,1,2,3,4,5);
@c = (0,1,2,3,4,5);
@d = (\@a,\@b,\@c);
foreach(@d){
foreach $e (@$_){
print "$e<br>";
}
}
0775nobodyさん
2005/05/08(日) 03:10:27ID:???0776nobodyさん
2005/05/08(日) 03:43:11ID:???0777うんこ
2005/05/08(日) 04:23:54ID:???$d->[0] = [ qw/1 2 3 4 5 6/ ];
$d->[1] = [ qw/1 2 3 4 5 6/ ];
$d->[5] = [ qw/1 2 3 4 5 6/ ];
$" = ', ';
for my $arr_ref (@$d){
print ref $arr_ref || 'undef';
print " [ @$arr_ref ]\n"
}
0778nobodyさん
2005/05/08(日) 06:47:54ID:???my @tmpはwhile内に書くべきだな。
あと俺的別解。
while (<FILE>) {
/^(.*?),(.*)$/;
$addr_list{$1} = $2;
}
0780nobodyさん
2005/05/08(日) 19:50:28ID:WVJV6mZK0783nobodyさん
2005/05/08(日) 20:29:12ID:uPGwNCs6うぇwwwうぇwwwうぇwwwっうぇおkwwwおkwww
っうぇwww
うはっwwwうぇwwwwww
うぇwwwっうぇwwwwwwwwwwwwっwwwwwwwwwwww
0784nobodyさん
2005/05/08(日) 20:43:54ID:tDynd5YAwwwwwwwwwwwwwおkwwwっうぇ
wwwwww
うぇwwwっうぇうはっwwwうはっwww
www
おkwwwうぇwwwうはっwwwwwwwww
0785nobodyさん
2005/05/08(日) 20:57:01ID:???そこら辺がいまいちよくわかってないんです。。
例えば関数で
sub hogege {
my @arr_return;
push @arr_return, 'hoge';
return \@arr_return;
}
$ref = &hogege();
print $$ref[0];
ってやって、関数の外でリファレンス参照して使えると思うんですが、
コレってつまり、myで作ったアドレスが裏で確保し続けられてるって事ですよね?
なので
foreach (@a) { my$aa; $a=1; }
↑とかやっちゃうと、回った数だけmyでアドレスを確保されちゃうような気がして
my $aa;
foreach (@a) { $a=1; }
delete $aa;
↑こういう風にしてるんですが。。
ここら辺って、どうなんでしょう?
0788nobodyさん
2005/05/08(日) 21:58:32ID:???delete EXPR
指定されたハッシュの、指定されたキーと対応する値を削除します。
%ENVの要素を削除すると環境変数が削除されます。
です。間違えました。undefでした(汗
0789nobodyさん
2005/05/08(日) 22:48:22ID:???for($i=0;$i<16;++$i) {
my $a;
print \$a,"\n";
}
どうなった?
0790nobodyさん
2005/05/08(日) 23:09:13ID:???ラクダ本とかだとその辺 (変数が消滅するタイミング) がきちんと解説されていたと記憶
そういや昔、循環参照するデータ構造を FastCGI で動かして
メモリが洩れまくって焦ったことがあったよ
0791nobodyさん
2005/05/08(日) 23:28:04ID:???データの保存先ディレクトリを変えること (たとえば実行スクリプトのあるとこにする) ってできるのかな?
やり方知ってる人いたら、説明書いてる URL でもいいから教えて… orz
0792nobodyさん
2005/05/08(日) 23:34:26ID:???全部同じ所を参照しておりました…何故だーw
ありがとうございます。
>>790
ラクダ本…今度立ち読みしてみます。。
一応以下本文及び実行結果です。。
(1) for($i=0;$i<3;++$i) { my $a; print \$a."<br>"; }
→ SCALAR(0xcf7a4), CALAR(0xcf7a4), SCALAR(0xcf7a4)
(2) for($i=0;$i<3;++$i) { print &asd(rand(time))."<br>"; }
→ SCALAR(0xf7178), SCALAR(0xf7340), SCALAR(0xf7178)
(3) for($i=0;$i<3;++$i) { my $a = &asd(rand(time)); print "$a<br>"; }
→ SCALAR(0xf7340), SCALAR(0xf7178), SCALAR(0xc6a98)
sub asd { my ($a) = @_; return \$a; }
0793nobodyさん
2005/05/09(月) 00:39:00ID:???それは Perl のコーディングやら DBI ではどうにもならん話で
たぶん MySQL スレあたりに行って聞いた方が良い
「シンボリックリンクで解決しる」とかいうことになるんじゃないかという気はする
0794nobodyさん
2005/05/09(月) 00:50:11ID:???シンボリックリンクだと意味ないなあw
ありが�d! 早いけど諦めてみる… orz
…あ、自分トコにデータファイルを作るデータベースの、とかはあるのかな?
0795nobodyさん
2005/05/09(月) 01:09:17ID:???0796nobodyさん
2005/05/09(月) 01:57:09ID:???0798nobodyさん
2005/05/09(月) 03:11:27ID:???0799nobodyさん
2005/05/09(月) 03:55:27ID:???0800nobodyさん
2005/05/09(月) 03:57:44ID:???0801nobodyさん
2005/05/09(月) 14:20:56ID:???タブ無効、改行有効です。
--------
foreach (@$ref) {
#デミリタは<>、元々の<>はエスケープ処理
foreach (@$_) {
$_ =~ s/¥<¥>/¥¥<¥¥>/g;
}
my $tmp = (join '<>', @$_);
#改行はタブに変換、元々のタブは無効(半角空白)にする
$tmp =~ s/\t/ /g;
$tmp =~ s/\r\n|\n/\t/g;
push @arr, $tmp;
}
--------
デミリタは<>、改行は\tに置き換えという仕様で、
タブ以外は基本的に入力通りのデータが出力されるようにしました。
ただし一点だけ、元々のデータが\<\>の場合のみ<>に変換されてしまいます。
これをうまく回避する方法ってないでしょうか。。
0802801
2005/05/09(月) 14:30:37ID:???$_ =~ s/\<\>/<>/g;
0803801
2005/05/09(月) 14:31:22ID:???$_ =~ s/\<\>/&lt;&gt;/g;
0804nobodyさん
2005/05/10(火) 19:42:37ID:xKdeSYjsAサーバーにあるファイルをBサーバーへFTPを使用して
送りたいのですがこのような事は可能でしょうか?
0805nobodyさん
2005/05/10(火) 19:43:20ID:???0806nobodyさん
2005/05/10(火) 19:50:44ID:???0807nobodyさん
2005/05/10(火) 20:05:04ID:???0808nobodyさん
2005/05/10(火) 20:05:45ID:???ttp://www2u.biglobe.ne.jp/~MAS/perl/waza/ftpput.html
0810nobodyさん
2005/05/10(火) 21:32:47ID:???/sage表示テスト/
↑これは正しくないというのは調べて分かりましたが、具体的にどうするのか分かりませんでした。
0812nobodyさん
2005/05/10(火) 23:34:43ID:???ttp://www.din.or.jp/~ohzaki/perl.htm#JP_Match
だけど…sjisは無理なんでは…?
0814nobodyさん
2005/05/11(水) 08:58:09ID:???$pattern = quotemeta($pattern);
if ($str =~ /^(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])*?(?:$pattern)/) {
print "マッチした\n";
}
SJISならquotemetaの一手間入れれば無問題。
0815nobodyさん
2005/05/11(水) 11:32:03ID:???0816nobodyさん
2005/05/11(水) 12:42:00ID:???0817nobodyさん
2005/05/11(水) 16:11:40ID:???0818nobodyさん
2005/05/11(水) 18:01:37ID:???http://perldoc.jp/docs/perl/5.8.0/perldelta.pod
0819nobodyさん
2005/05/11(水) 20:29:01ID:???0820nobodyさん
2005/05/12(木) 00:56:52ID:???これが書いてある行で
Modification of a read-only value attempted
のエラーが出てしまいます
定数値の変更をしようとしているように見えないのですがどういうことなんでしょう?
@DATAは
undef @DATA;
open(IN,GetFilePath("file")) or return;#GetFilePathはファイルパスを返す
my @data=<IN>;
close(IN);
@hashnamelist=qw(no date name);
foreach my $count(0..$#data){
chop $data[$count];
my @buf=split(/,/,$data[$count]); my $i=0;
foreach (@hashnamelist) { $DATA[$count]->{$_}=$buf[$i];$i++;}
}
というような感じでファイルから読んだデータを入れています
0821nobodyさん
2005/05/12(木) 01:30:40ID:???いきなり $DATA[$count]->{$_} ←こんなことやっていいっけ?
$DATA[$count] がちゃんとハッシュリファレンスになる?
0822nobodyさん
2005/05/12(木) 02:27:49ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlref.html#Using_References
0823nobodyさん
2005/05/12(木) 02:32:51ID:???@一致した行 = grep(/正規表現/, @検索対象);
じゃないの?
0824nobodyさん
2005/05/12(木) 03:02:54ID:???0825nobodyさん
2005/05/12(木) 08:39:16ID:???そもそもここは何をしたいんだ?
0826nobodyさん
2005/05/12(木) 10:38:53ID:???むしろ$hashがあやしいような気がする。
0827nobodyさん
2005/05/12(木) 12:31:48ID:???my @list;
{
local $_;
my @temp;
foreach $_ (@DATA) {
if($_->{name} eq $hash->{name}) {
push @temp,$_;
}
}
@list = @temp;
}
とか。
0828nobodyさん
2005/05/12(木) 13:33:43ID:???>>821と同じような動作をするだろうものを書いてみたが、普通に動いたぞ。
my $hash = { Name => 'nobodyさん' };
my @list;
{
my @DATA;
my @data = <DATA>;
my @hashnamelist = qw(No Date Name);
foreach my $count (0..$#data){
chomp $data[$count];
my @buf = split /,/, $data[$count];
%{$DATA[$count]} = map { $hashnamelist[$_] => $buf[$_] } 0..$#buf;
}
@list = grep $_->{Name} eq $hash->{Name}, @DATA;
}
foreach (@list) { print $_->{No}, " " }
__DATA__
820,2005-05-12,nobodyさん
123,2005-01-23,名無しさん
821,2005-05-12,nobodyさん
0829nobodyさん
2005/05/12(木) 13:36:27ID:???あと10行目の 0..$buf は 0..$#hashnamelist の間違い。
0830nobodyさん
2005/05/12(木) 14:02:54ID:???>値を変化させる式があるわけでもないしread-onlyは関係ない気もする。
$hashの値がハッシュのリファレンスでなければ「$hash->{name}」を
参照しただけで新しい無名ハッシュが作られてそのリファレンスが
$hashに代入されます。
my $hash;
print "1:$hash\n";
my $x = $hash->{name};
print "2:$hash\n";
0831nobodyさん
2005/05/12(木) 14:22:14ID:???$hash = 1;
$hash->{name} = 10;
print "1: " . $hash . "\n";
print "2: " . $hash->{name} . "\n";
$hash++;
print "3: " . $hash . "\n";
print "4: " . $hash->{name} . "\n";
を実行した結果が
1: 1
2: 10
3: 2
4:
となる原理をいまいちよく理解できてない俺ガイル
0832nobodyさん
2005/05/12(木) 15:24:33ID:???$hashの値がundefなら値の参照による暗黙の生成のときに無名ハッシュが
できてそのハードリファレンスが$hashに入るが、この場合は既にスカラー値が
入っているのでその辺は関係なくて、ただのシンボリックリファレンス。
すなわち、$hash = 1のときに
$hash->{name} = 10;
とするとそれは%{1}というハッシュ変数をいじっていることになる。
矢印演算子が出来る前の書き方
${$hash}{name} = 10;
と同じ。
従って、上の4つのprintが表示しているものは、
1: $hashの値'1'
2: ${1}{name}の値'10'
3: $hashの値'2'
4: ${2}{name}の値(入ってないので空文字列'')
0833nobodyさん
2005/05/12(木) 19:54:59ID:1WfKcKYp0835833
2005/05/12(木) 21:02:30ID:???助言サンクス。
1: 自分はこういう事がしたい。
→お気に入りのサイトの掲示板のスクリプトがどーしても見たい
2: それでこんな風にやってみたが・・・
→URLの上で右クリックして「対象をファイルに保存」ってやってみた
3: こんなエラーが出て上手く行かなかった。
→そのスクリプトが生成するページがダウンロードされるだけで、肝心のスクリプトは見れなかった
スクリプトもHTMLと同じテキストファイルなので、ブラウザから見る方法があるに違いないと思って質問してみました。
Perlの勉強には、好きなサイトのスクリプトのまねをするのが一番だと思って。
0836833
2005/05/12(木) 21:05:05ID:???よそのスレで見かけてもマルチって怒らないでくださいね。
0837nobodyさん
2005/05/12(木) 21:08:48ID:???PC本体を少し斜めに傾けるとうまくいく事があるよ。
0838nobodyさん
2005/05/12(木) 22:54:49ID:???入力された文字列から、記号や日本語を削除して
アルファベットと数字のみに変換する方法を教えてください。
[a-zA-Z0-9]をなんとかすればいいのかなと思うのですが・・・。
0840nobodyさん
2005/05/12(木) 23:44:44ID:???すみません。それでは日本語が化けてしまいます。
[1い2-45ab,D*Eあ]->[1BB245abDEBB]
本当は[1245abde]になってほしいんです
0843nobodyさん
2005/05/13(金) 01:03:10ID:???http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
http://www.din.or.jp/~ohzaki/perl.htm#Character
君の書いてる例だと更に tr/A-Z/a-z/ が必要そうだが。
0844843
2005/05/13(金) 01:07:10ID:???#!/usr/local/bin/perl -w
use strict;
use encoding 'shiftjis';
my $str = '1い2-45ab,D*Eあ';
$str =~ tr/0-9A-Za-z//cd;
$str =~ tr/A-Z/a-z/;
print $str;
__END__
0845nobodyさん
2005/05/13(金) 01:33:06ID:???0846nobodyさん
2005/05/13(金) 02:11:13ID:???use encoding 'shiftjis';
これを入れるだけでOKですか?他に何かいりますか?
0847nobodyさん
2005/05/13(金) 02:11:40ID:???$str =~ s/[\x81-\x9F\xE0-\xFC].|[^0-9A-Za-z]//g;
0848nobodyさん
2005/05/13(金) 02:18:33ID:???0849nobodyさん
2005/05/13(金) 04:30:51ID:???0851nobodyさん
2005/05/13(金) 15:35:11ID:oLTDJ3fd----------------config.pl
package config;
my $DATA_DIR="hoge";
1;
----------------
とある時
「test.cgi」で上記ファイルを利用したいのですが
----------------
require 'config.pl';
my $writedir=&config::DATA_DIR;
:
----------------
としても
Undefined subroutine &config::DATA_DIR called at test.cgi line 9.
とエラーが出てしまいます。
どの様に表記するのが良いのでしょうか?
不躾で申し訳ございませんが
お教え頂けますとありがたいです。
0852nobodyさん
2005/05/13(金) 15:46:54ID:???0853851
2005/05/13(金) 16:00:36ID:???RESありがとうございます。
私何か勘違いしていました、、
>&config::DATA_DIR
って関数呼ぶときに使うやつじゃん、、、
どうも ありがとうございます。
0854nobodyさん
2005/05/13(金) 16:35:07ID:???■ このスレッドは過去ログ倉庫に格納されています