Perlコーディング初心者質問スレ Part 41
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
05/03/10 00:47:16ID:sT66OcmD【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
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:???0856nobodyさん
2005/05/14(土) 10:32:29ID:???漢字コードはシフトJISということで
my $input_string = '1い2-45ab,D*Eあ';
(my $output_string = join '',
grep{
/^[^\x81-\x9F\xE0-\xFC]/
} $input_string =~ /(
(?:
[\x81-\x9F\xE0-\xFC]
[\x40-\x7E\x80-\xFC]
)+
|
[^\x81-\x9F\xE0-\xFC]+
)/gx
) =~ s/[^\da-zA-Z]//g;
$output_string =~ tr/A-Z/a-z/;
print "$output_string\n";
0857nobodyさん
2005/05/14(土) 10:38:34ID:???my $input_string = '1い2-45ab,D*Eあ';
(my $output_string = lc join '',
grep{
/^[^\x81-\x9F\xE0-\xFC]/
} $input_string =~ /(
(?:
[\x81-\x9F\xE0-\xFC]
[\x40-\x7E\x80-\xFC]
)+
|
[^\x81-\x9F\xE0-\xFC]+
)/gx
) =~ s/[^\da-zA-Z]//g;
print "$output_string\n";
0858nobodyさん
2005/05/14(土) 11:06:06ID:???grepはいらないだろ。
my $input_string = '1い2-45ab,D*Eあ';
(my $output_string = lc join '', $input_string =~ /
(?: [\x81-\x9F\xE0-\xFC] [\x40-\x7E\x80-\xFC] )+
| ( [^\x81-\x9F\xE0-\xFC]+ )
/gx) =~ tr/[0-9a-z]//cd;
print "$output_string\n";
0859nobodyさん
NGNGtr/[0-9a-z]//cd これはまずいよ。文字に [ や ] があれば入り込んでしまう。
print lc join('', $input_string=~/[\x81-\x9F\xE0-\xFC].|([a-zA-Z\d])/g),"\n"
0860nobodyさん
2005/05/14(土) 13:19:43ID:???my $str = '1い2-45ab,D*E';
($str = new Jcode($str)->euc) =~ tr/1-9A-Za-z//dc;
print $str;
0861nobodyさん
2005/05/16(月) 00:56:01ID:???投票のCGIを作りたいのですが、重複を防ぐにはどうしたらいいんでしょうか?
IPをチェックしても固定でなければ接続し直せば変わるし
クッキーも消せばまた投票できてしまいますよね?
完全に重複を防ぐというのは無理ですか?
0864nobodyさん
2005/05/16(月) 16:13:22ID:???0865nobodyさん
2005/05/16(月) 16:16:16ID:???0866nobodyさん
2005/05/17(火) 18:42:49ID:???----------------
my %TEST_HASH = (
'test' => 'jya'
);
foreach $key (keys %TEST_HASH){
print "$key<br>";
}
----------------
ではちゃんと表示されたのですが
----------------[config.pl]
package config;
my %TEST_HASH = (
'test' => 'jya'
);
1;
----------------
と
----------------
require 'config.pl';
foreach $key (keys %config::TEST_HASH){
print "$key<br>";
}
----------------
とすると表示されません。
表記方法が悪いのでしょうか?
ご助力いただけますと幸いです。
0867nobodyさん
2005/05/17(火) 18:57:56ID:???0868nobodyさん
2005/05/17(火) 19:11:47ID:???0869866
2005/05/17(火) 19:22:40ID:???ありがとうございます。
myを消したらうまく表示できました。
本当にどうもありがとうございます。
0870nobodyさん
2005/05/17(火) 23:02:44ID:hBcfSLHc0871nobodyさん
2005/05/17(火) 23:52:44ID:???0872nobodyさん
2005/05/18(水) 00:14:10ID:tzJs81c1と、いいますと?
0873nobodyさん
2005/05/18(水) 00:27:27ID:???0874nobodyさん
2005/05/18(水) 00:33:14ID:???0875nobodyさん
2005/05/18(水) 01:11:07ID:tzJs81c1初心者の僕には彼>>874の言っていることが全く理解できません
0876nobodyさん
2005/05/18(水) 02:17:09ID:???一体何を読んで Perl を勉強してるの?
0877nobodyさん
2005/05/18(水) 03:07:06ID:???$_=$ENV{QUERY_STRING};s/\+/ /g;s/%([\da-fA-F]{2})/chr hex$1/eg;eval;
このプログラムはどんなことがでるのでしょう?
とりあえず実行してみたら500エラーがでてしまいました。
0878nobodyさん
2005/05/18(水) 03:17:20ID:3k0gZS+pKENT。。
0879nobodyさん
2005/05/18(水) 05:02:33ID:???どっちでもいいならつけた方がわかりやすいと思うのですが・・・
0881nobodyさん
2005/05/18(水) 05:54:30ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsub.html
別に使っちゃまずいわけではないが、& の有無で生じる細かい
挙動の差を理解しているなら、多くの場合 & 無しの挙動の方が
より「望ましい」という結論に達しないか?
Perl を matt's や KENT で覚えたから付いてる方がしっくりくる
という理由だけで & を付け続けている子は、さっさと Perl4 の
呪縛から抜け出してほしいな。
0883nobodyさん
2005/05/18(水) 10:37:57ID:???($a,$b,$c) = &sub($x,$y,$z);
より
($a,$b,$c) = sub($x,$y,$z);
のほうがいいってこと?
でもKENTと「すぐわかるPerl」で学んだからなぁ・・・
なかなかクセが抜けねぇ。
0884nobodyさん
2005/05/18(水) 11:20:28ID:???初めから完璧なプログラム組める人はいないし、Perlは比較的安全なつくりに
なってるから&つけるつけないにこだわる人は向いてないと思う。
0885nobodyさん
2005/05/18(水) 11:50:46ID:???0886nobodyさん
2005/05/18(水) 12:16:54ID:???0887nobodyさん
2005/05/18(水) 12:40:03ID:???0888nobodyさん
2005/05/18(水) 12:49:24ID:???プロトタイプが効かなかったり、と、何度も痛い目に遭ったことがあるので、
& 付けるの止めました。
0889nobodyさん
2005/05/18(水) 16:16:41ID:???これからやめよ。
0890nobodyさん
2005/05/18(水) 16:33:35ID:???文字列
AAA/BBB/CCC
を
AAA/BBB/
に。
文字列
DD/EEEEEE/FF
を
DD/EEEEEE/
にするような良い方法はないのでしょうか?
indexで'/'の場所を2回計測しないとやはり駄目でしょうか?
0892nobodyさん
2005/05/18(水) 16:49:05ID:???んー、前ベンチとったときがあるけど、
my $dir = 'aaa/bbb/ccc';
1: $dir =~ s/[^\/]*$//;
2: $dir = substr ($dir, 0 , rindex ($dir, '/') + 1);
3: substr ($dir, rindex ($dir, '/') + 1) = '';
try 100,000
1: 0.98 [s]
2: 0.47 [s]
3: 0.86 [s]
ってことで 2 が早いかも
0893890
2005/05/18(水) 16:53:44ID:???rindexというのがあったのですね、、、
解決しました。どうもです。
0894nobodyさん
2005/05/18(水) 20:12:52ID:l3LfkbbV別々のdatファイルに入ってる変数の$aと$b
この2つに同じ数字が代入されているかどうかを確認したい。
2: それでこんな風にやってみたが・・・
if ($a == $b) {
print "true\n";
}
else {
print "false\n";
}
3: こんなエラーが出て上手く行かなかった。
$aと$bに同じ数字が入っていても、スルーされて、すぐelseの方に入ってしまいます。
同じdatファイルにある変数同士ならスルーされないんですが
別々のdatファイルに格納されてる物を確認するにはどうしたら良いでしょうか。
0895894
2005/05/18(水) 20:37:04ID:???if (!($a == $b)) {
としたらできました。
でも、これってどうしてなんでしょうか…???
if ($a != $b) {
これだと、できなかったんですが…??
0897894
2005/05/18(水) 21:47:19ID:???CR+LFです。
つか、できたと思ったんですが勘違いでした…(;´Д`)やはりスルーされました
0898nobodyさん
2005/05/18(水) 21:59:10ID:???もしくは
if ($a eq $b) {
じゃだめ?
0899nobodyさん
2005/05/18(水) 22:02:44ID:1rjH09kt受け取り側で
sub aaa
{
my $bbb = shift;
my @ccc = shift;
#以下処理
}
見たいな感じで受け取り側でスカラーとアレイを受け取れますか?
なんかうまくいかないのです。
配列を受け取ろうとすると。。
0900nobodyさん
2005/05/18(水) 22:11:11ID:???きみ、shift が何をする関数か知らず、ただ引数を受け取るためのおまじないだと思ってるぢゃろ
my ($bbb,@ccc) = @_ とすれば受け取れるけど、なぜそれで受け取れるのか、
なぜ shift ではダメなのか、自分で調べてみそ
0901nobodyさん
2005/05/18(水) 22:37:10ID:???sub aaa{
my $who = shift;
my $items = shift;
以下略・・・
}
0902894
2005/05/18(水) 22:52:46ID:???ネ申
ありがとうございました……マジで
0903nobodyさん
2005/05/19(木) 11:30:49ID:???>>896が言いたいことは変数に改行コードがくっついたままじゃないかって事だと思う
$a = chomp($a);
$b = chomp($b);
0904nobodyさん
2005/05/19(木) 11:32:49ID:???chomp($a);
だけでおk
0905nobodyさん
2005/05/19(木) 14:11:39ID:???予定時間設定しといて、アラーム音出したいんだけど。
0906nobodyさん
2005/05/19(木) 14:26:36ID:???0907nobodyさん
2005/05/19(木) 15:01:14ID:???0908nobodyさん
2005/05/19(木) 15:38:09ID:???cgiとかの引数ってどうやって取得するのでしょうか?
(hoge.cgi?day=20050519)
↑ここを取得したい。
基本的なことで申し訳ございませんが
手元の本には載っていないので
お教えいただけないでしょうか?
レス数が900を超えています。1000を超えると表示できなくなるよ。