Perlコーディング初心者質問スレ Part 41
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/03/10 00:47:16ID:sT66OcmD【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0449nobodyさん
2005/04/08(金) 21:02:13ID:???http://www.din.or.jp/~ohzaki/perl.htm#Character
0450nobodyさん
2005/04/08(金) 22:02:13ID:???何に対して「最近」か知らんけど、OS 側のライブラリにも依るんじゃないの。
http://search.cpan.org/src/NWCLARK/perl-5.8.2/ext/Socket/Socket.xs
http://search.cpan.org/src/NWCLARK/perl-5.8.6/ext/Socket/Socket.xs
http://search.cpan.org/~nwclark/perl-5.8.6/pod/perlhist.pod
0451448
2005/04/08(金) 22:56:06ID:???ありがとうございます。
OSのライブラリgethostbyname()に依存している可能性が
あるわけですね。
CGIを書いているのですが、CGIに関しては質問を受け付けないと
言っているISPなので困ったなあ。
0452nobodyさん
2005/04/08(金) 23:08:49ID:OhDnlIyMopendir(DIR, "./$folder");
@dir = readdir(DIR);
closedir(DIR);
for($i=0;$dir[$i];$i++){
$ts = ($dir[$i] =~ /^\d+\.html/) ?
(stat("./$folder/$dir[$i]"))[9] - 800000000 : ' ';
$dir[$i] = "$ts,$dir[$i]";
}
@dir = sort {$b cmp $a;} @dir;
これってopendir(DIR, "ls-t./$folder");
で済むと言われたのですが
UNIXでのOS環境でのことですよね?
コーディングでOSのコマンドを利用するようなやり方は
あまりよく知らないもので。
0453nobodyさん
2005/04/08(金) 23:31:30ID:???0454nobodyさん
2005/04/08(金) 23:44:12ID:OhDnlIyMなんか疑問に感じた。
ディレクトリのなかのファイルを新しい日付順に降順で並び換える
プログラムなのですが、、、
そもそもlsって表示コマンドだし、-tオプションは昇順表示だし。
OSのコマンドを使うにしても並び換えのコマンドだと
思うのだが。
よくわからんが負荷が高いからこのほうがいい、と言われた。
0455nobodyさん
2005/04/08(金) 23:54:12ID:OhDnlIyMじゃなかった。
opendir(DIR, "ls-t./$folder|");
だった。
そもそもこの場合の|の意味がわからんのですが、、、
0456nobodyさん
2005/04/09(土) 00:11:56ID:gYWC+2uysort -rだと思うのだが、、、
0457nobodyさん
2005/04/09(土) 00:34:17ID:gYWC+2uyそれなら並び換えはいらんのだが
しかしlsコマンドでいいのかわからん。
0458nobodyさん
2005/04/09(土) 00:52:37ID:???ls -t の出力をパイプで自分に流し込む話
0459nobodyさん
2005/04/09(土) 00:58:37ID:gYWC+2uy加工させるスクリプトに持っていくのかな。
しかし初心者ながらこういうやり方まで頭がいかんかった。
つまりファイル操作ならOSのコマンドで代用すればいいじゃない。
ということが。
0460nobodyさん
2005/04/09(土) 01:07:49ID:gYWC+2uy@dir = readdir(DIR);
closedir(DIR);
for($i=0;$dir[$i];$i++){
#$ts = ($dir[$i] =~ /^\d+\.html/) ?
(stat("./$folder/$dir[$i]"))[9] - 800000000 : ' ';
$dir[$i] = "$ts,$dir[$i]";
}
@dir = sort {$b cmp $a;} @dir;
for($i=$next - 21;$i < $next+100-21 && $dir[$i];$i++){
($ts, $file) = split(/,/, $dir[$i]);
last if $ts eq ' ';
open(R, "./$folder/$file");
$_ = <R>;
close(R);
/<b>([^\<]*)<\/b>/;
$j = $i+1;
print W " $j<a href=\"$file\">$1</a>\n";
}
こういう構造でのスクリプトは古いのだろうか。
open(DIR, "ls -t ./$folder |") で
やればあきらかに負荷軽減になるのだろうか。
0461nobodyさん
2005/04/09(土) 01:13:06ID:???0462nobodyさん
2005/04/09(土) 01:34:53ID:gYWC+2uyopen(DIR, "dir -d ./$folder|");
ということになるのだろうか?
そもそもソースにOSコマンド書いたからといって
OSがどう連動してくれてるか
わからないのだが。
0463nobodyさん
2005/04/09(土) 01:53:22ID:gYWC+2uy0464nobodyさん
2005/04/09(土) 02:38:31ID:???OSコマンドって言ってる時点で(ry
まずは自分が何を知りたいのか整理しろ。
そして質問は分かりやすく謙虚に書け。
0465nobodyさん
2005/04/09(土) 02:45:27ID:gYWC+2uy謙虚もクソもあるか。
てめえの言い方も横柄だろうが。
わからねえならそれでいいんだよ。
クソが。
0466nobodyさん
2005/04/09(土) 02:56:29ID:???0467nobodyさん
2005/04/09(土) 03:02:18ID:???パイプを open するとプロセスが別に生成されて
場合によっては shell まで呼び出されたりして
かえって負荷が高くなる場合も多いと思う
まあ結局はケースバイケースだが
0468nobodyさん
2005/04/09(土) 03:35:06ID:???ちょこちょこI/O負荷をかけるよりは。
0469nobodyさん
2005/04/09(土) 06:49:56ID:???fork自体のコストが高いから、CGIには向かないかも。
windowsなら、これ入れておけばそこそこunix環境に近くなる。
http://unxutils.sourceforge.net/
0470nobodyさん
2005/04/09(土) 11:44:26ID:???どうすればいいんですか?
0471nobodyさん
2005/04/09(土) 12:16:31ID:???0472nobodyさん
2005/04/09(土) 12:46:24ID:???0473nobodyさん
2005/04/09(土) 13:04:45ID:???感謝!助かりました!
0476nobodyさん
2005/04/09(土) 13:38:10ID:???0477nobodyさん
2005/04/09(土) 13:41:18ID:???0478nobodyさん
2005/04/09(土) 14:26:27ID:???0479nobodyさん
2005/04/09(土) 14:39:34ID:???0482nobodyさん
2005/04/10(日) 00:14:51ID:???0483nobodyさん
2005/04/10(日) 00:30:04ID:???0484nobodyさん
2005/04/10(日) 01:41:29ID:???$ cat omaera_aho.pl
print 'すべての素数'
$ perl omaera_aho.pl
すべての素数
0485nobodyさん
2005/04/10(日) 02:41:51ID:???二回 read したいんだけど、seek(STDIN, 0, 0) しても先頭に戻らなかった・・・。
一回グローバルな変数に置いておくとか、ファイルに書き出すとかしかないんかな?
うーむ。
0486nobodyさん
2005/04/10(日) 03:20:01ID:???0487nobodyさん
2005/04/10(日) 10:33:46ID:???速くなりますか?あるいは速くする書き方はありますか?
0488nobodyさん
2005/04/10(日) 16:56:27ID:???http://www.oreilly.co.jp/books/4873110971/toc.html
24章を読め。
0489nobodyさん
2005/04/10(日) 17:58:57ID:???~s/\$se/ selected="selected"/i;
だとうまく行きません。どうすればいいでしょうか。
0490nobodyさん
2005/04/10(日) 19:16:45ID:???$buf =~ s/\$sel/selected="selected"/i;
print $buf;
ふつーに出来たけど
0491nobodyさん
2005/04/10(日) 19:54:56ID:???↑
0492nobodyさん
2005/04/10(日) 20:04:56ID:???0493nobodyさん
2005/04/11(月) 08:27:59ID:???↑
この頭の~は何のためにつけてるのだろうか?
0495nobodyさん
2005/04/11(月) 13:30:35ID:???0496nobodyさん
2005/04/11(月) 15:06:37ID:???0497nobodyさん
2005/04/11(月) 17:22:12ID:???0498nobodyさん
2005/04/11(月) 18:48:58ID:???0499nobodyさん
2005/04/12(火) 03:03:59ID:qneeBtxS例えば↓なら結果として 3 が欲しいのです。
$str = 'a<br>bb<br>cccccc<br>dd';
現在は、配列を経由させてなんとか取得しています。
$str = 'a<br>bb<br>cccccc<br>dd';
$result = @dummy = $str =~ m/<br>/g;
print $result;
0500nobodyさん
2005/04/12(火) 03:25:15ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_can_I_count_the_number_of_oc
$result++ while $str =~ /<br>/g;
$result++ while ($pos = index $str, '<br>', $pos)++ > -1;
$result = @{[ $str =~ /<br>/g ]};
$result = $#{[ split /<br>/, $str ]};
0501499
2005/04/12(火) 09:03:28ID:???1行目の方法でいきたいと思います。
ありがとうございました。
0502nobodyさん
2005/04/12(火) 22:17:46ID:jd+szO9r↑の部分に直接サブルーチンを書いて判定させたいのですが、どのようにすればいいですか?
if (&{foreach (keys(%{$CONFIG{'add'}})) { return 1 if $data[$_][0] == $_; } return 0;})
こんな風に書いてみたのですが、returnで返したのが不味かったらしく、エラーが出てしまいました。
どのように書けば良いのか知っている方ご教授して頂けると嬉しいです。
0503nobodyさん
2005/04/12(火) 22:56:01ID:???エラーが出たならエラーメッセージを読めばいいじゃない。
「Can't return *outside* a subroutine」と答は出てるだろ?
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlref.html
0505nobodyさん
2005/04/13(水) 16:47:52ID:3dbRXjnXPerlにはJavaのようなboolean型のような変数宣言はできないのでしょうか。
数値以外は文字列として扱う必要があるのでしょうか。
$isErr = false;
if ($isError) {
print "Error";
} else {
print "Not Error";
}
こう書くと実行はできるのですが、-cwで文字列をどうにかしろとのエラーが出てしまいます。
0506nobodyさん
2005/04/13(水) 16:49:26ID:???修正しても、結果は変わらないのですが・・・
0507nobodyさん
2005/04/13(水) 17:04:28ID:???sub false () {0}
print("True\n") if true;
print("False\n") unless false;
0508nobodyさん
2005/04/13(水) 21:30:45ID:mF6hKb8mこれを
No.000001 あいうえお
No.000002 かきくけこ
No.000003 さしすせそ
No.000004 たちつてと
みたいにやるのってどうやるの?
単純に No.[000000-999999] の前に改行入れたらマ白になたヨ
0509nobodyさん
2005/04/13(水) 21:38:08ID:???0510nobodyさん
2005/04/14(木) 03:04:17ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html
Perl では undef か空文字列か 0 が偽、その他は真。false と
いう名の演算子もリテラルも存在しないので、サブルーチン
false を定義していない限り $isErr = false; の false は
bare word (裸の単語) と解釈され、$isErr = 'false'; と同義。
-w オプションは bare word を見つけると警告を出す。
>>508
>>1
0511nobodyさん
2005/04/14(木) 11:37:45ID:us4u4fSx「サーバーを再起動せずに新しいモジュールをインストールする方法は後述する」
と書かれているのですが、何処に書かれているか、わかりませんorz
どなたかわかりませんでしょうか。
まさかApache::Registryの事じゃないですよね・・・
スレ違いかもしれませんが、お願いします。もしくは誘導先でも。
0512nobodyさん
2005/04/14(木) 12:21:12ID:???なんだかメルヘンな話やね
0513nobodyさん
2005/04/14(木) 13:48:31ID:???Registryの事なんでしょうかね。
DSOみたいな薄いラッパーになるハンドラ書けば動くかなぁ。
他にRegistoryの動作を大幅に簡略化するオプションでもあればいいのですが。
ちょっとズレますが、ModPerl::RegistryBBって使ってる方居られます?
これ使う為に、Registory以上に気をつけることとかあるのでしょうか。
0514nobodyさん
2005/04/14(木) 14:41:46ID:???新しいモジュールをインストールってことは、Apache::StatINC では無いよね?
そもそもインストールだけなら再起動なんていらないけど、
再起動せずにハンドラに加えたいってことかな?
Apache->push_handlers するハンドラを Apache::StatINC で見張ってれば
出来そうな気もする。試したこと無いけど。
0515nobodyさん
2005/04/14(木) 16:03:05ID:us4u4fSxはいそうです、言葉足らずでしたorz
>Apache->push_handlers するハンドラを Apache::StatINC で見張
なるほど、その方法で出来そうな気が・・・(汗)
けどmod_perlの機能でお手軽に。。ってわけにはいきませんね_| ̄|○
0516nobodyさん
2005/04/15(金) 04:54:49ID:???文字コードがjisなので、以下のようにしましたが、"put search word: "
の部分が画面に表示されません。
use Encode;
use encoding "jis";
print "put search word: ";
chomp($word = <STDIN>);
$word = decode('jis', $word);
while(<>) {
$line = decode('jis', $_);
if ($line =~ /$word/) {
print "$ARGV\n";
}
}
どうしたらよいでしょうか。また、画面表示の部分に日本語を使うことは
できるでしょうか。当方、windows上でcygwinを使用、rxvtの端末文字コードは
sjisにしてあります。
0517nobodyさん
2005/04/15(金) 06:28:27ID:ftMFD1Fr"世田谷(セタガヤ)"
"北海道(ホッカイドウ)"
"宗谷岬(ソウヤミサキ)"
といった文字列それぞれから、「地名」と「よみ」を抽出したいと考えています。
そこで、以下のようにやってみたのですが、
($chimei,$yomi) = $str =~ /([^(]+)((.+)/;
そうすると、
"宗谷岬(ソウヤミサキ)"の場合だけ、
$chimei -> 谷岬
$yomi -> ソウヤミサキ
となってしまいます。
文字コードはeuc-jpで処理しており、「宗」の2バイト目と「(」の1バイト目が
同じために、意図しているようにマッチしないということまではわかったのですが、
どのような正規表現を使えばよいかがわかりません。
こういった場合、どのように処理すればよいのでしょうか。
ちなみに、文字コードは以下のとおりです。
宗→\xBD\xA1(->\xA1\xCA
よろしくお願いします。
0518nobodyさん
2005/04/15(金) 07:31:33ID:???こちらの環境では表示されるので分からんが、出力バッファ絡みなら
print する前に $| = 1; か、print 後に更に print "";
> 画面表示の部分に日本語を使うことはできるでしょうか。
ターミナルが表示できる文字コードで出力すればいいんじゃない。
http://www.kt.rim.or.jp/~kbk/perl-5.8/encoding.html
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
>>517
http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
0519nobodyさん
2005/04/15(金) 08:21:34ID:ierbYSVR以下のようにして解決いたしました。
#!/usr/local/bin/perl
$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';
@str = qw(東京(トウキョウ) 世田谷(セタガヤ) 北海道(ホッカイドウ) 宗谷岬(ソウヤミサキ));
foreach $str (@str){
(@m) = $str =~ /^((?:$ascii|$twoBytes|$threeBytes)*?)(((?:$ascii|$twoBytes|$threeBytes)+))/;
print "$str ->".join(",",@m)."\n";
}
0521質問
2005/04/15(金) 16:33:41ID:jvrJ4EBi例えば
<BR>市町村 <BR>
<SELECT
name=pref>
<OPTION value="" selected>---お選びください---</OPTION>
<OPTION
value=川越>川越</OPTION>
<OPTION value=さいたま>さいたま</OPTION>
<OPTION
value=秩父>秩父</OPTION>
<OPTION value=熊谷>熊谷</OPTION>
</SELECT>
上のようなHTML文書を
スクリプトによって
<BR>市町村 <BR>
<SELECT name=pref>
<OPTION value="" selected>---お選びください---</OPTION>
<OPTION value=川越>川越</OPTION>
<OPTION value=さいたま>さいたま</OPTION>
<OPTION value=秩父>秩父</OPTION>
<OPTION value=熊谷>熊谷</OPTION>
</SELECT>
のように並び替えるにはどうしたらよいでしょうか?
ちなみに
$html = s/((?:\G|>)[^<]*?)\n/$1/g;
のように書いたのですがうまくいきませんでした。
0522nobodyさん
2005/04/15(金) 16:38:59ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perltrap.html#Perl_Traps
0523nobodyさん
2005/04/15(金) 18:14:48ID:???0524質問
2005/04/15(金) 18:52:11ID:jvrJ4EBiありがとうございました。ちょっと難しすぎて分かりませんでした・・・orz
再び正規表現ですいません。
<市部:さいたま>
<郡部:吉見>
<市部:秩父>
<市部:川越>
↓上のデータを
<市部:さいたま市>
<郡部:吉見>
<市部:秩父市>
<市部:川越市>
のように先頭から「<市部:●●>」とマッチングするものを、
「<市部:●●市>」に置き換えるにはどうしたらよいでしょうか
(ただし、「●●」は流動的なものとする)
$data =~ s/<[市部:]*>/<市部:$_市>/;
上のようにやったところ、$_に何も値が入りません。
0525nobodyさん
2005/04/15(金) 18:53:41ID:???正規表現道場@2ch Part4
http://pc8.2ch.net/test/read.cgi/php/1105930285/
0526nobodyさん
2005/04/16(土) 01:58:57ID:zFFmYmjwで、確認画面で
パスワードを表示されないようにしたい(現在は表示される)んですけど、
やり方、わかり方、教えてください。
よろしくお願いします。
0528nobodyさん
2005/04/16(土) 02:09:25ID:zFFmYmjwフォーム画面では表示されないのですが、確認画面では表示されてしまいます。
それを隠す方法はあるのでしょうか?
0530516
2005/04/16(土) 18:09:31ID:???いろいろやったら、結局、入力および出力はそれぞれ同じに
しておかなければだめだということが分かりました。つまり、
<STDIN>からの入力とwhile(<>)で読み込む入力が異なって
いたのでだめだったようです。そこで、以下のようにしたら
OKでした。
----------
use Encode;
use encoding 'shift-jis', STDIN=>'shift-jis', STDOUT=>'shift-jis';
$| = 1;
print "input a search word: ";
# print "";
chomp($search = <STDIN>);
print "$search\n";
# $word = encode('jis', $search);
while(<>) {
$line = decode('jis', $_);
if ($line =~ /$search/) {
print "$ARGV\n";
}
}
--------
ご報告まで。
0531nobodyさん
2005/04/16(土) 23:26:54ID:???質問は下記にあるものなのですが、なにとぞ教えてください。
PerlでCGIなのですが、
例えば十個の$a1,$a2…$a10があり、
ここに10をランダムに格納していきたいのです。
…うまく説明できない…
例えば、
一回目は $a1=2,$a2=3,…$a10=1 でトータルで10
二回目は $a1=4,$a2=1,…$a10=2 でトータルで10
これを十回繰り返す。
という具合です。
判り難くて申し訳ないのですが、
なにとぞご教授下さいませ。
0532nobodyさん
2005/04/16(土) 23:41:29ID:???0533nobodyさん
2005/04/16(土) 23:44:21ID:???0534nobodyさん
2005/04/16(土) 23:46:51ID:???0535nobodyさん
2005/04/16(土) 23:48:26ID:???0536nobodyさん
2005/04/16(土) 23:58:37ID:kx2lH57mfor($i=0;$i<=10;$i++){
?????????????????
}
↑
この?部分で$1~$10に限られた数値をランダムで入れていきたいのですが、
その処理の仕方がわからないのです。
0537nobodyさん
2005/04/17(日) 00:01:52ID:???0538nobodyさん
2005/04/17(日) 00:22:26ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_do_I_shuffle_an_array_random
http://boobar.hp.infoseek.co.jp/bench/randlist.txt
sub rand_num {
my @num = @_;
for (my $i = @num; --$i;) {
my $j = int rand($i + 1);
$j == $i && next;
@num[$i, $j] = @num[$j, $i];
}
@num;
}
for (1..10) {
print "$_ - ";
my($a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8, $a9, $a10) = rand_num(1..10);
print join '/', $a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8, $a9, $a10;
print "\n";
}
0539nobodyさん
2005/04/17(日) 13:12:59ID:???その上で、やりたい事がイマイチよく分からん。
10個の数の満たすべき条件は何?
10個の合計が10になる事?
それとも、ひとつひとつの数が0以上10以下の範囲ならいいの?
0540nobodyさん
2005/04/17(日) 14:33:17ID:???前々から気になってたんですが、
その perlfaq に載ってる方法のランダム性ってどうなんですかね?
例えば 1,2,3,4,5,6,7,8,9,10 と綺麗に並んだのができる確率って
splice 使う方法だと 1/10! になりますが
速い方のだと明らかにこれより大きくなりますよね?
0541nobodyさん
2005/04/17(日) 16:08:52ID:???0542nobodyさん
2005/04/17(日) 16:17:38ID:???プログラミングの為の数学と算数 vol.2
http://pc8.2ch.net/test/read.cgi/tech/1094368921/
0543T女の竹田
2005/04/17(日) 16:21:33ID:???こんなのはどうかな?
@hash{1..10} = ();
@array = ();
for (1..10) {
$array[$_] = (keys %hash)[int(rand(11-$_))];
delete $hash{$array[$_]};
}
0544T女の竹田
2005/04/17(日) 16:27:32ID:???spliceの方がいいし。忘れてください。
0545nobodyさん
2005/04/17(日) 19:06:27ID:???シャッフル?
List::Utilが使えるのなら、List::Utilのshuffleで。
use List::Util qw(shuffle);
for(1..10){
my @a = shuffle(1..10);
print "@a";
}
0546nobodyさん
2005/04/18(月) 17:36:57ID:uIr0c1v3ActivePerl-5.8.4.810-MSWin32-x86.msi
OS:XpSp2
を使っています。
$pack = pack("C*", 0x7E, 0x00, 0xFE, 0x40, 0x52, 0x00);
とすれば普通にパックしてくれるのですが
$pack = "0x7E, 0x00, 0xFE, 0x40, 0x52, 0x00";
$pack = pack("C*", $pack);
とした場合、パックしてくれません。
@pack = (0x7E, 0x00, 0xFE, 0x40, 0x52, 0x00);
$pack = pack("C*", @pack);
としてみた場合も同じです。
0x7Eみたいなデータを変数にいれてpackするには
どうしたらよいのでしょうか?
アドバイスいただけるとありがたいです。
0547ero 141-190-213.biwa.ne.jp/
2005/04/18(月) 18:39:47ID:???ぇ ハ っ
け
る ァ w おk w
は w w
0548nobodyさん
2005/04/18(月) 18:48:21ID:???あとの方でいけると思うが。一応試してみたが大丈夫だぞ?
% perl -e 'print pack("C*", 0x7e,0x00,0xfe,0x40,0x52,0x00)' | hex
0x00000000: 7e 00 fe 40 52 00 - ~@.@R@
% perl -e '@pack=(0x7e,0x00,0xfe,0x40,0x52,0x00); print pack "C*", @pack' | hex
0x00000000: 7e 00 fe 40 52 00 - ~@.@R@
■ このスレッドは過去ログ倉庫に格納されています