Perl コーディング初心者質問コーナー Part36
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん
04/07/14 13:23ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0877874
04/08/19 19:21ID:???可読性の問題で;わかりやすい変数名にしたいんだ。
>>876
オゥ!?thx!
$queryはわかりやすいね。Aを使わせてもらおうかな。
0879nobodyさん
04/08/19 20:31ID:???言いたいことには賛成なんだが、コンパイラは読みやすさなんぞ
微塵も求めちゃいないし、アルゴリズムってのは個々の問題解決
方法を指すのであって、全体の構成や設計を指す場合には使わん。
0880nobodyさん
04/08/19 22:03ID:???GMT(UTC)とどのくらいの時差があるかを知るには
どうすればいいでしょうか?
Windows / UNIX 双方で共通に使える方法があれば
それでお願いします。
0881nobodyさん
04/08/19 22:24ID:???Time::Zoneでいいんでね? 例えば、
perl -MTime::Zone -e 'print tz_local_offset();'
→ 32400
perl -MTime::Zone -e 'print tz_name();'
→ jst
windowsでは使ったことないんで動くかどうか知らんけど。
0882nobodyさん
04/08/19 23:05ID:TB99xw7Gこのスクリプトの冒頭に出てくる
my($encode) = @_;
この行はどんな処理をしているのでしょうか?
以降の処理を見ると $encode には euc や sjis などの
文字列が入っているような気がするんですが、
↑の処理でなぜ $encode に文字列が代入されるのかがわからんのです……。
0884nobodyさん
04/08/20 01:49ID:???UNIXコマンドの df -kを使って求めたハードディスクの容量(KByte単位)を
GB単位への変換方法がわかりません。
求めた値÷1024÷1024から、splintfで%4.1dとして表示させると
小数点以下が0になってしまいます。
1GB未満 (500KByte等) は0.5GBと表示させたいと思います。
贅沢をいえば、小数点以下第2位を四捨五入できればベストです。
どなたか、お助けください。
よろしくお願いします。
0887nobodyさん
04/08/20 15:13ID:???>>884
%dで小数が表示されるわけないだろう。
これ、どこかでも書いたな。
886 :nobodyさん age :04/08/20 15:10 ID:???
>>885
夢の中だろ?
0889nobodyさん
04/08/20 18:39ID:???0890nobodyさん
04/08/20 19:23ID:???文字列って言ってもな・・・数字は%02dとか便利だけど%sって実際どういう時に使うと便利なのかな
ということでおまいらのカコイイ%sの使い方を、投稿しる。
0891nobodyさん
04/08/20 19:32ID:???0894nobodyさん
04/08/20 19:44ID:???他人のプログラムいじり倒していたら、どれを使っていて使ってないか分からなくなってしまいまして。
0897nobodyさん
04/08/20 20:17ID:???$s = 25;
$str = 'クネクネしとけ';
for (1..6 * $s) {
printf "%${\(length($str) + $s + int $s * sin 4 * atan2(1, 1) / $s * $_)}s\n", $str;
}
0898nobodyさん
04/08/20 20:17ID:pmEwrR+2B::Xref使えば?
0899nobodyさん
04/08/20 21:25ID:???文字の桁揃えとか。
0900nobodyさん
04/08/20 21:26ID:???printf qq|あなたのリモートホストは %s です。\n|, $ENV{REMOTE_HOST};
printf qq|BBQ に%s\n|,
(join '.', unpack 'C4', gethostbyname sprintf qq|%s.niku.2ch.net.|, join '.', reverse split /\./, $ENV{REMOTE_ADDR}) =~ /^127\.0\.0\.\d/
? qq|絶賛登録中ですよ。(・∀・)ニヤニヤ|
: qq|は掲載されていないようです。(゚∀゚)アヒャヒャ|;
0901nobodyさん
04/08/20 21:43ID:???整形はCSSでやれや
0902nobodyさん
04/08/20 21:56ID:???一応送り先と本文が、自由に書き込めるようなタイプ。
0906nobodyさん
04/08/20 22:59ID:???文字をエスケープする事より、いたずらに使われない方法を考える事が重要と思われ。
0907nobodyさん
04/08/20 23:02ID:???CGIゲームを作ろうと思っているのですが、perlで作るのが一番効率がいいのでしょうか?
CGIゲームを配布して下さっている方の物をいくつか見てみたところ、全てperlが使われていたのでやはりperlが良さそうですかね
それよりもいい言語等あれば是非お教え下さいませんか
0909nobodyさん
04/08/20 23:11ID:???うは・・・申し訳ないです
perlに詳しい方々が集まっているようなので聞いて見たかったのですが・・・
どのスレで聞いたらいいのだろう・・・
0912nobodyさん
04/08/20 23:30ID:???0913nobodyさん
04/08/20 23:42ID:NLrO80pOif ( hogehoge条件式 ) {
print <<EOF;
hogehogeテスト中
EOF
}
こういう制御構文の中では、行頭インデントをして見やすくしたいものですが、
ヒアドキュメントを使うと、プログラム上のインデントまで出力されてしまいます。
HTML出力以外ですと、困る場合があるのですが、ヒアドキュメントを使いながら
プログラム上でのインデントを出力させないような方法はあるでしょうか?
とりあえず今は制御構文の中ではヒアドキュメントを使わないようにしてますが、
ヒアドキュメントは便利なので、インデント問題が解消されるならば使いたいです。
とびっきりエロイ人おながいしますm(__)m
0914nobodyさん
04/08/20 23:45ID:???0915902
04/08/20 23:49ID:???あて先 → -_@.,以外をエスケープ。
本文 → 何でもあり
ってことでいい?
本文って何でもありなんだね。HTMLメールだとしても問題はないってことかな。
HTMLメールは送れないように、タグを置換しとこうかと考えたけど、意味ないのね。
>>906
通販サイトの注文システム構築してて、管理画面で使うメールフォームだから
悪用はされないと思う。.htaccess+CGIのダブル認証にしてあるから。
0917nobodyさん
04/08/20 23:55ID:???0918nobodyさん
04/08/20 23:58ID:???$' = "\n";
if ( hogehoge条件式 ) {
print "hogehogeテスト中",
"hagehageつらいな",
"higehige濃すぎるぜ";
}
$' = "";
これで勘弁してくれないか?一応printは1回だし、\nも面倒ではない。
ただ俺の頭の中のPerl6でしかテストしてないから、現実のPerlでどんな挙動なのかは
自分で試してくれ。
0920902
04/08/21 00:02ID:???そうだった;ちょっと盲点だったよ;
でもそれって難しくない?今は<textarea>要素に初期状態(ほとんど完成状態)をぶち込んで
店の人が送信を押すとフォームメールcgiにつながるんだけど、textarea内でHTMLエスケープしておいて
送る時にはHTMLエスケープ以前の状態に戻して送信ってできる?
0921nobodyさん
04/08/21 00:03ID:???# まぁいろいろと
}
if ( hogehoge ) {
print_anti_indent (<<" EOF");
<!doctype>
<html>
<body>
</body>
</html>
EOF
}
0922913
04/08/21 00:05ID:???やはりヒアドキュメントでは無理でしょうか・・・
>>919
???terapad使ってます。インデントは自動ではなくて手動です。
ヒアドキュメント内で、出力されないインデントなんてやっぱりありえないですよね・・・・
一度変数に入れて正規表現でインデントを削除するくらいしかないですよねorz
そんな無駄な処理するなら、素直にprintしたほうがいいですね。
0923nobodyさん
04/08/21 00:06ID:???どうした?
別に「エディタが勝手に変なインデントするから困る」なんて書いてないわけだが。
0924nobodyさん
04/08/21 00:07ID:???入れ子に入れるとソース見にくくなるからヒアドキュメントはできるだけ止めてる
0925913
04/08/21 00:10ID:???sub print_anti_indent {
my $value = shift;
$value =~ s/\n\t/\n/g;
print $value;
}
こんな感じですか?
0926nobodyさん
04/08/21 00:17ID:???プッツンして・・・・・してやった。
0927nobodyさん
04/08/21 00:20ID:???こんなんでどう?
sub print_anti_indent {
my $value = shift;
my $indent = '';
# 最初の行から、インデントの深さを検出する
if ($value =~ s/^(\s+)//) {
$indent = $1;
}
# 次の行以降のインデントを取り去る
if (length($indent) > 0) {
$value =~ s/\n$indent/\n/g;
}
print $value;
}
0928nobodyさん
04/08/21 00:21ID:???Perlの時代が戻ってきたのか?なんにせよいいことだ。
0929927
04/08/21 00:24ID:???927みたいなコード書いちゃったけど、も少しシンプルにもできるか。わずかな差だけどね。
0931nobodyさん
04/08/21 00:40ID:???my $Out_Strings = sprintf <<EOF, 'hogehoge', 'hagehage';
>>> %sテスト中
>>> %sテスト中
EOF
# 無駄なインデントを取り除く無駄な処理(w
$Out_Strings =~ s/^\t+?>>>//m;
print $Out_Strings;
}
♪いろいろな方法があると思うよん。
0932nobodyさん
04/08/21 00:45ID:???スルニョー
つーか927はだめだ。\s は \n と \r にもマッチするから
ヘンなところでヘンなバグを生む可能性があるな。
927を使いたいなら
- if ($value =~ s/^(\s+)//) {
+ if ($value =~ s/^([ \t]+)//) {
の方がよさげ。
0933nobodyさん
04/08/21 00:45ID:???まあ確かに万人向けではないわな
0934nobodyさん
04/08/21 00:52ID:???まさか再帰が書けるとは思わなかったよ。
0935nobodyさん
04/08/21 01:07ID:???DBI位わかりやすい解説サイトがあるといいんだけどな。
探すのが面倒だし、不要なメソッドを抱えてるオブジェクトなんかと
仲良くしたくないから結局自分で作ってしまう。
今のとこ使えるのは
use DBI;
use strict;
だけだ;覚えようか迷ってるのはHTML::Templateとかいうやつくらい。
思いと評判なので使いそうにないけどw
0936初心者
04/08/21 04:37ID:???Perlで一括処理をさせたいのですが、
あるフォルダ配下の複数フォルダにあるファイルをまとめてリネームしhtmlリンクを修正
させたいのですが可能ですか?
最終的にはwork\index.htmから追いたいです
work/
|-1
|-2
|-3
|-4
|-5
以下100程度
手作業で1フォルダ毎やるのが耐えられなかった。。。できますよね。
0938初心者
04/08/21 04:47ID:???カレントディレクトリからフォルダ毎書き換えていたのですが、正直
これじゃ辛いっす。できると思いたいのですが。。。。。
0940初心者
04/08/21 04:57ID:???0941初心者
04/08/21 04:58ID:???>939様
間違えたorz....
0942nobodyさん
04/08/21 05:05ID:???できないならソフトでやればいいじゃん
0943nobodyさん
04/08/21 06:14ID:???新人か?
このスレは大型連休になると盛り上がる。
休みの間にちょこっとPerlでもやってみようって奴が増えるからな。
お陰で厨質問が増える。
その手軽さはPerlのよさではあるが。
0944nobodyさん
04/08/21 06:25ID:???0945nobodyさん
04/08/21 08:43ID:???導入などの手間を考えればPerlの方が手軽なのは間違いない。
0946nobodyさん
04/08/21 09:28ID:???0948nobodyさん
04/08/21 11:38ID:???http://www.genpaku.org/realprogrammerj.html
0949nobodyさん
04/08/21 11:48ID:???ということで、オレサマはこれからrubyを覚えることに決めた。
0950nobodyさん
04/08/21 12:59ID:???0951nobodyさん
04/08/21 13:46ID:???0954nobodyさん
04/08/21 14:13ID:CvZOz/sJ$class->method1();
とかしてもまだbless前だし。
クラス名::mthod1();
こんなことすると、第一引数がクラスにならずに食い違っちゃうし;
一瞬ライブラリでも作ってrequireでもするか。とか考えたけど、それやるとオブジェクトが独立しないし。
一体どうすればいいのさ!
0955nobodyさん
04/08/21 14:17ID:???print "content-type:text/html\n\n";
みたいな部分ってなんて呼べばいいでっしゃろか?
ヘッダ?
header?
HTTPのヘッダ?
あんさんらだけが頼りですわ。
0956nobodyさん
04/08/21 14:34ID:???クラスメソッドはuseすれば、すぐに使える。
new()がbless前に呼び出せるのは何故だか考えてみたまえ。
>>955
perlで書いてはあるが、禿しくスレ違い。「メッセージヘッダー」だ。
0957954
04/08/21 14:37ID:7q3lmCCRあ、
クラス名->method1
の形式で呼べばよかったのね^^
0958nobodyさん
04/08/21 14:44ID:???メッセージヘッダ???エスケープ時の引数名で迷ってまんのや。
例えば &escape($value,"html") って呼ぶとHTML用のエスケープ処理をしてくれる便利なやつや。
そんでな、クッキーとかを焼かはる時にもその「メッセージヘッダ」用のエスケープをしよるんやけど
なんて名前で渡そうかな思てな。
massageheader だとちょっと冗長やろ?わかりやすくてしかも冗長でない最高の
ネーミングを頼んますわ。httpってのもええかな思てるけど・・・
0959nobodyさん
04/08/21 14:53ID:???my @test;
push @test,$_ foreach @array;]
print @test;
use strict環境下で@testの宣言をせずに、pushと同時にローカルであると宣言したいんですが、
push my @test,"hghghg";
はうまくいきますが
push my @test ,$_ foreach @array;
だとうまくいきません。どうしますか?
0960nobodyさん
04/08/21 15:23ID:???my @test;
push
}
0961nobodyさん
04/08/21 15:52ID:???名前で悩まなくても済むようにperlには素晴らしい機能がある。
$_, @_つかえ。
>>959
> @testの宣言をせずに
理由は?
0962nobodyさん
04/08/21 16:22ID:???何を言うてまんのや
$_ = "html";
こんな事せえへんで。第1引数が置換する文字列で第2引数が、何のエスケープかてなってるんやわ。
ヘッダ用のエスケープに使う時の第2引数の名前で悩んでるや。
なにかええのんないやろか
0963959
04/08/21 16:25ID:????
>>961
my @test;
push @test,$_ foreach @array;]
要はこれを一行で済ませたいんです。なんかいちいちmy宣言だけの行があるのがかっこ悪くていやなんです。
0965nobodyさん
04/08/21 17:07ID:???my @test = @array;
おわり。
加工したければ、
my @test = map やりたいこと, @array;
0966954
04/08/21 17:13ID:7q3lmCCRmap BLOCK,LIST;
の書式の場合、返り血をリストコンテキストで評価すると何が返されるの?
@test = ( "a1","a2" );
@an = map { $_ =~ s/a//g } @test;
これだとわかりやすく$_を置換したものが毎回の返り血だけど、
@test = ( "a1","a2" );
@an = map { my $a = 5;
$_ =~ s/a//g } @test;
これだとmap内の一行目の代入成功の真(1)が毎回返される。
@test = ( "a1","a2" );
@an = map { $_ =~ s/a//g;
my $a = 5 } @test;
今度は5が毎回返される。
map内の任意の処理結果を返させたい時にはどうするもんなの?
returnとかやっても期待通りの結果が得られないんだけど。
0968nobodyさん
04/08/21 17:33ID:???■ ■
■ 臭い方言(特に関西弁)は禁止です ■
■ ■
■■■■■■■■■■■■■■■■■■
0969nobodyさん
04/08/21 17:45ID:???headerでいきよることにしましたわ。おおきに。
>>968
おまえ様ルールを押し付けんといてや。
方言があかんなんてアホな話あるかいな。
0970nobodyさん
04/08/21 17:47ID:???> 返り血をリストコンテキストで評価すると何が返されるの?
そのままリストが返されるかと。。。
> map内の任意の処理結果を返させたい時にはどうするもんなの?
> returnとかやっても期待通りの結果が得られないんだけど。
目的が読めませんね。
単に sub や、 eval にした方がよいのでは?
0971nobodyさん
04/08/21 17:51ID:???> おまえ様ルールを押し付けんといてや。
> 方言があかんなんてアホな話あるかいな。
おまはんルールで勝手にエセ関西弁使てるのもワヤですわな。
普通にしとけ。
あと、レスポンスのエンティティヘッダな、> Content-type: strings;
RFC 2068 とか読んどけや。
0972nobodyさん
04/08/21 18:01ID:???>おまはんルールで勝手にエセ関西弁使てるのもワヤですわな。
おまえさんもいつも勝手に標準語使ってはるのやろ?
あんさん言ってることが支離滅裂でっせ。
0973954
04/08/21 18:08ID:7q3lmCCRやりたいことは
@a = qw/1 2 3 4 5/;
$a = join "&",map {
$value = &test($_);
$_."=".$value;
} @a;
こういう感じなんだけど、mapのブロック内のどの処理結果が返されるのかが、明確に理解できてなくて;
一応↑のソースは期待通りの結果が得られるんだけど、今後のために質問してみた。
例えば
@hoge = map { join "i",$_;
join "w",$_;
}@a;
なんかの場合は一体何が返るのか一見ではわからないから、サブルーチンみたく明示的にしたいけど
そういう場合はどうするものなのかなって思って。
0974954
04/08/21 18:10ID:7q3lmCCR思いっきり間違えた;
@hoge = map { my $a = $_ + 2;
my $b = $_ + 5;
}@a;
とかに変更;
0975大阪に30年住んでますが
04/08/21 18:20ID:???> おまえさんもいつも勝手に標準語使ってはるのやろ?
上のほうは自然に読めるけど、下のは読んでいて気持ち悪いですよ。
# 京都の人っぽいけど「すごく無理して書いてる」という印象を受ける。
0976nobodyさん
04/08/21 18:22ID:???%hash = (
a => 1,
":" => 2,
"_" => 3,
);
foreach ( grep /^\w*$/ , keys %hash ) {
print $_,":",$hash{$_},"<br>";
}
これでは_アンダースコアがあってもマッチしてしてまうのですが、完全に英数字だけにマッチさせるには
/^[a-zA-Z0-9]*$/のような方法しかありませんか?メタ文字から任意の一字を引いたりできるとカコイイんですが。
レス数が950を超えています。1000を超えると書き込みができなくなります。