Perl コーディング初心者質問コーナー Part34
■ このスレッドは過去ログ倉庫に格納されています
0001前スレの連投で気分崩したので後よろ
04/04/05 16:01ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0554nobodyさん
04/05/06 17:07ID:???0555nobodyさん
04/05/06 18:11ID:???0556nobodyさん
04/05/06 21:28ID:???---- xml2.xml ----------------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>
<data>
<shop num="01">
<name val="a">AAAshop1</name>
<name val="b">AAAshop2</name>
<tel>012-345-6789</tel>
</shop>
<shop num="02">
<name>BBBshop</name>
<tel>098-765-4321</tel>
</shop>
</data>
------------------------------------------------------
0557続き
04/05/06 21:29ID:???------------------------------------------------------
#!/usr/local/bin/perl
use XML::DOM;
$xmlfile = "./xml2.xml";
my $parser = new XML::DOM::Parser;
my $doc = $parser->parsefile ("$xmlfile");
my $nodes = $doc->getElementsByTagName ("shop");
my $n = $nodes->getLength;
for (my $i = 0; $i < $n; $i++){
my $node = $nodes->item($i);
my $attr = $node->getAttribute("num");
print $attr."-attr\n";
my $child = $node->getElementsByTagName("name");
my $nn = $child->item(0);
my $val = $nn->getAttribute("val");
print $val."-val\n";
my @child_val = $node->getElementsByTagName("name");
my $child_val = $child_val[0];
print $child_val."-child_val\n";#●
}
------------------------------------------------------
0558続き2
04/05/06 21:29ID:???01-attr
a-val
XML::DOM::Element=ARRAY(0x843e234)-child_val
02-attr
-val
XML::DOM::Element=ARRAY(0x84406fc)-child_val
------------------------------------------------------
このような表示になります。
●の部分が「XML::DOM::Element=ARRAY(0x843e234)-child_val」こうなってしまいますが
「AAAshop1」や「AAAshop2」「BBBshop」を取得するにはどうすれば良いのでしょうか?
0559nobodyさん
04/05/06 21:41ID:???今までテキストか、リストによるものだけだったんですが
今回、チェックボックスを使いたいんですが、
どのようにperl側に情報が送られてくるのでしょうか・・・。
0565nobodyさん
04/05/06 23:47ID:21UK75Lzmy @child_val = $node->getElementsByTagName("name");
my $child_val = $child_val[0];
の部分を
my $child_val = $nn->getFirstChild->getData;
0566556-558
04/05/07 10:22ID:???全文は自分で書いてませんが
ttp://member.nifty.ne.jp/hippo2000/perltips/xml/dom.htm
を参考に部分部分を変えて書きました。
>>565
ありがとうございます!ばっちり表示できました。
おかげ様でやっと次の段階に進めそうです。
0567nobodyさん
04/05/07 12:50ID:p3Wu+afh$honbun =~ s/$FORM{'text'}/<font style=\"background:#00ffff\">$FORM{'text'}<\/font>/g;
print "本文=$honbun";
というプログラムで本文を置換したいんですけどフォームからaaaなどを入力してもエラーにはならないけど
コーヒーと入力するとエラーになってしまいます。
どうしたらコーヒーと入力してもエラーがでないんでしょうか?
0570nobodyさん
04/05/07 15:03ID:???$honbun = 'aaabbbcccdddeeefffコーヒー';
$keyword = 'コーヒー';
$keyword =~ s/([\+\*\.\?\^\$\[\-\]\|\(\)\\])/\\$1/g;
$honbun =~ s/($keyword)/<b>$1<\/b>/g;
print "本文=$honbun";
0571nobodyさん
04/05/07 15:35ID:???これをHTML上に表示するにはどのようにすればよいのでしょうか?
現在は$files[1]〜$files[15]というように1個1個記述してます。
何か良い方法があればアドバイスいただければと思います。
0573nobodyさん
04/05/07 15:44ID:???0574571
04/05/07 15:55ID:???ありがとん
foreach $key (@files) { print "<a href=\"$key\">$key</a><br>\n";}
ってやったら出来た
サンクスコ
0575nobodyさん
04/05/07 16:45ID:???0576nobodyさん
04/05/07 20:24ID:zsY2eiyt一人複数投票をなるべく避けるようにしたいのですが、こういう
場合、どのような工夫があるでしょうか?
とりあえず同一アドレスははじきます。リスクはありますが、
プロバイダの同一サクセスポイントもはじこうと思っています。
他にどういう手があるでしょうか?もちろん100%防ぐのは
無理だと思いますし、そんな厳密なアンケートでもない
(どっちかというと遊びっぽい)ので、少しでも役立つ
方法をご存知でしたら、教えてください。
よろしくお願いします。
0577nobodyさん
04/05/07 20:26ID:???> プロバイダの同一サクセスポイントもはじこうと思っています。
ネタだろ?
0578nobodyさん
04/05/07 20:33ID:???個数をカウントするにはどうすればいいですか・・?
0579nobodyさん
04/05/07 20:35ID:???0582nobodyさん
04/05/07 21:12ID:???0583576
04/05/07 21:46ID:???>>581
あ、クッキーという手がありましたね。消して再投票する人もありえるでしょうが、
一定の効果はありそうですね。ありがとうございます。
0584nobodyさん
04/05/07 22:57ID:???@array にたとえば「あ」「い」「う」が入っているとして、
それを$aiuにマッチすればそのまま、マッチしなければそのループを抜ける
という表記なつもりなのですが、結果がうまくいきません。
foreach $i (@array){
if ($aiu =~ /^([\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*$i/i) { ; }
else { next; }
}
どのようにかきかえればいいでしょうか?
0585nobodyさん
04/05/07 23:13ID:???foreach my $str (@array){
$str = quotemeta $str;
if( !$aiu =~ /$str/){
last; # ループを抜けるのはlastです
}
}
こんなもんでどうなんでしょう? 正規表現はそんなにややこしくする必要ありですか?
0586nobodyさん
04/05/07 23:39ID:???まずそれは EUC-JP とうまく付き合いたがっているコードなわけだけど
@array と $aiu はきちんと EUC-JP ですか?
0587586
04/05/07 23:53ID:???0588584
04/05/08 00:20ID:???エラーはおこりませんが、HITしませんでした。。。
下のレスにもかかれてたコードのせいですかねぇ?
>>586
EUC-JPかどうか実はよくわかっていません・・・が、
なぜか部分部分でそのコードを入れないと反応しないものがありまして。
なくてもうまくいく場合もあるんですが、
基本的に日本語が含まれるものには無いとうまくいかないようです。
0589nobodyさん
04/05/08 00:59ID:???@lst = (12, 20);
これを print を用いて「12 20」のように表示したいのですが、
print($fmt, @lst); では「%d %d1220」と表示されてしまいます。
「12 20」のようにするにはどうしたらよいでしょうか。
ちなみに、$fmt, @lst は動的に変わり、
要素が2個とは限りません。
C言語の va_list のようなことができるのか知りたいです。
0592nobodyさん
04/05/08 01:41ID:???僕が良くワンライナで使う手はこう。
$ perl -e '@list=(1..5);print join(" ", @list);'
1 2 3 4 5
0593nobodyさん
04/05/08 01:45ID:???0595nobodyさん
04/05/08 02:19ID:3p4uAER8「バイナリ構造体」の意味がイマイチつかめなくて困ってます。
「バイナリ」は2進法とかいう感じの意味らしいですが、では「バイナリ構造体」
とは構造が2進法である。みたいな感じですか?なんか変な感じ・・・
バイナリはいろんな所で調べれますが、バイナリ構造体という言葉の説明はみつかりません。
どうやらスカラ変数や s/〜//; の〜部分もバイナリ構造体らしいのですが、どなたか
バイナリ構造体の意味を教えてくださいませんか。お願いします。
0596nobodyさん
04/05/08 02:25ID:???0597nobodyさん
04/05/08 02:51ID:???0598nobodyさん
04/05/08 02:58ID:???プログラミングで構造体と言うと既にある型を使って新しい型を作ることを指す。
Perlは基本的にデータを文字列で記憶するからそれをバイナリ値にしたものが
バイナリ構造体。
0599nobodyさん
04/05/08 03:09ID:???でも s/?//; の?の部分がバイナリ構造体だというのはいまいち意味がわからない
0600595
04/05/08 03:29ID:???ということは文字列をバイナリ値(0と1)に変換して記憶・保存する構造自体がバイナリ構造体ですか?
>>599
packってpack後にバイナリ構造体に結果を返すって勉強したので、packの結果を受け取れる
場所はスカラ変数に限らず、全てバイナリ構造体と言える?あれる?のかなと思いましたが・・・・・
う〜ん難しいですね。スカラや配列って文字列のまま記憶・格納しているのですか?
例)$x = "あいうえお";
という代入をした場合、「あいうえお」のままはコンピューターは保存できませんよね?
だから、保存時に2進数に直して保存し、呼び出すと自動で解凍?される・・・・のですか?
その仕組みがバイナリ構造体そのもの????
0601nobodyさん
04/05/08 03:40ID:???バイナリ値というのは2進数のことではない。
それにPerlにおいてバイナリ構造体の意味を学んでも役には立たないから
おかしな理解をしてしまう前にpackして得られる値とだけ思っておけ。
0602595
04/05/08 04:20ID:???「整数値を、2 の補数表現で符号化したものをバイナリ値とする。」こんな程度しか
バイナリ値ではひっかかりませんでしたがとりあえず単純な2進数ということでは
ないようですね。
プログラム関係って言葉の意味さえわかれば関数や表記法なんて結構どうにでもなるかな
と思ってるんですよ。理解できない言葉があると勉強の効率が悪いので私にとっては
言葉の意味は重要なんですよ。
プログラム関係の言葉の辞書って今アスキーっていうHP使ってますが、他にどこか
いいとこありますか?アスキーはバイナリ値もバイナリ構造体も載っていませんでしたので
プログラム系の言葉に特化してる辞書とかないですかね
0603595
04/05/08 04:27ID:???「0x」とは、後に続く文字列が16進数であることを示しているらしいのですが、
print hex(0xa);
としてみたら16が表示されました。
print hex(a);
の場合は10なのですが、「0x」は後続が16進数であるという示し以外にどのような
効果を与えるのでしょうか?
0604nobodyさん
04/05/08 05:08ID:???# 10
print hex 10;
# 16
0605nobodyさん
04/05/08 12:01ID:???英語版の perldoc などには存在しない。
よって正確な定義もたぶん存在しない。
たぶんCの構造体(struct)との類推で作られた言葉だとは思う。
struct の定義ならCの入門書でも読めばわかるが、
「なぜこんなものが必要なのか、実際何の役に立つのか」ということは
実際にCのプログラムを作ってみないとわからんだろうな。
0606nobodyさん
04/05/08 14:38ID:???$hoge
@hoge
%hoge
0608595
04/05/08 15:22ID:???>>604どうやらhex関数の引数として「0x」をつかうとちょっと違うことになるみたいですね。
通常は「0x」が前につけば単に16進数という宣言みたいですが、どうしてhex関数の引数
で使うとおかしな事になるんでしょう。
そういえば、バイナリ値以外にもchar値とかその他にもいっぱい「〜値」というものが
あるんですね。どっかにいろんな「〜値」について詳しく解説してるサイト知りませんか?
0609nobodyさん
04/05/08 15:59ID:???何もおかしくないのに>>604を見てわからないならかなりニブいな。
packで指定する型のcharやintや浮動小数点だのをひっくるめてバイナリ値を呼ぶ。
どんな型があるかはpack関数を調べればいい。
いいかげんスレ違いになってきたからここらでやめれ。
0611584
04/05/08 16:58ID:???>>584 の質問誰かお願いします。。。
調べたところ、すべてEUCにはされていました。
if ($aiu ne 'all') {
if ($aiu =~ /^([\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*$array[0]/i ||
$aiu =~ /^([\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*$array[1]/i) { ; }
else { last; }
}
だと、理想的な結果が出るんですが、2枚目のページにいくと、
結果がクリアされるようなんです・・・。
0612nobodyさん
04/05/08 17:09ID:???誰か2枚目のページってどんなのか知ってる?
知ってる人が教えてあげて。
0613nobodyさん
04/05/08 17:13ID:???0614595
04/05/08 18:04ID:??????
print a; #aが出力
print 0xa; #10が出力
print hex a; #10が出力
print hex 0xa; #16が出力
???
本当にわかりません・・・教えてください。
ところでこの話はスレ違いなんですか?ここは変換処理にかかわる事ならOKっていうわけでは
ないんですか^^;
0615nobodyさん
04/05/08 18:14ID:t33qT0Phif( 文章 =~ 適当な単語) ){
処理
}
という方法では
(´・ω・`) のようなものに引っ掛からないみたいで、、、
こう言う場合はどのようにマッチさせれば良いのでしょう?
0616nobodyさん
04/05/08 18:17ID:???perlはjcodeがいるだろ
0617595
04/05/08 18:24ID:???0xってhexと同じような働きがあるから
print hex 0xa;
っていうのは
print hex (hex a);
と同じことで、流れ的には「a」を10に変換してさらにそれを16進数として評価してしまう!!!
ってことですね^^やっとhex問題が片付いた。バイナリ値問題はまだまだですが++;
ほんと日本語が世界語だったらプログラム用語もPC関連用語ももっと簡単だったろうになあ
0620nobodyさん
04/05/08 18:28ID:???まぁ、釣りではないとして回答しておこう。
>理解できない言葉があると勉強の効率が悪いので私にとっては
>言葉の意味は重要なんですよ。
細かいことにこだわりすぎだと思うがね。
プログラミング用語自体、文脈で結構柔軟な解釈がされることもある。
所詮、用語自体が「表記法」に過ぎないと思う。
>614
hex が文字列を引数としてとること、Perl が型変換を自動で行うこと、
0xa は数値であること、キーワード以外の単語は文字列として扱われること、
以上を元に少し考えてみれば?
>ところでこの話はスレ違いなんですか?
>ここは変換処理にかかわる事ならOKっていうわけではないんですか^^;
スレタイ嫁、変換処理ってなんだよ?
# あと末尾のは顔文字のつもりかしらんが、個人的に妙にいらつくぞ。
>どっかにいろんな「〜値」について詳しく解説してるサイト知りませんか?
総じて Perl コーディング以前の問題のような気がするんだよ。
0621615
04/05/08 18:44ID:t33qT0Ph説明文が激しく半端でした。
HTMLから必要な単語を抜き出して、それがそのHTML内に何回出現しているか
確認するプログラムを書いています。
例えば
<FONT COLOR="#ffff00">そいつぁショボンヌ(´・ω・`)</FONT>
という行からindex関数で前のタグと後ろのタグを見つけて
「そいつぁショボンヌ(´・ω・`)」を単語として抜き出しています。
この単語を文章とマッチさせているのですが、どうも顔文字が上手くマッチしてくれないのです。
他の単語は普通にマッチするようなので、顔文字の文字がまずいのかなと思ったのですが、、、、、
0622nobodyさん
04/05/08 19:02ID:???おれはどんなやつよりも素早く目的のフレーズを探し出して
みせるぜ!
0623595
04/05/08 19:07ID:???コーディング 【coding】
(1)
⇒符号化(ふごうか)
(2)コンピューターなどで,一定のプログラム言語を用いて,プログラムを作成すること。
ふごうか 【符号化】
(1)
〔encoding〕
情報がある一定の規則に基づいて符号に変換されること。記憶における記銘や,非言語コミュニケーションにおける表情の表出などもこの例として捉(とら)えられる。
→解読
(2)
〔数〕
〔coding〕
一連の情報を適切な符号系を定めて符号に変換すること。
とありましたので変換処理とも言えるのかなっと・・・
顔文字の件申し訳ないです。
>総じて Perl コーディング以前の問題のような気がするんだよ。
かもしれませんね。
私的には記述方法とかってあまり問題じゃなくて、関数やコーディングの機能・処理内容自体を日本語のみで全くの素人にでも
教える事ができるようになる事が大切かなって思ってます。なので、細かいとこにこだわって他人より要領が
すこぶる悪い・・・自分でも自覚してます。
とりあずこのスレで、私のように基本的な部分を質問するのは迷惑になってしまうようですね。ごめんなさい。
0625595
04/05/08 19:23ID:???>Perlは基本的にデータを文字列で記憶するからそれをバイナリ値にしたものが
>バイナリ構造体。
バイナリ→テキスト形式(文字データ)以外のデータ形式全般。
値がテキスト形式以外のデータ形式であれば全てバイナリ値。
char値→バイナリ値の分類の中の・・・・
とりあえずここで学んだことをまとめておきました。それでは失礼します。
0626名無しさん
04/05/08 19:29ID:cBod9el7バイナリ構造体なんてどっから拾ってきた言葉だかしらんが、言葉は
何かを説明するためにあるのであって、造語を前提なしに持ち出して
どういう意味なんだと考える自体が無意味。初心的どうこうではない。
プログラムはアルゴリズム実現の表記手段であって哲学的誤謬に陥るのは愚。
>>624 同じく一票
顔文字って()を使うからねぇ。。。Perlのメタ文字が入る場合は注意だし。
0627595
04/05/08 19:31ID:???pack("C*",0x41); #A
第2引数以降のリストで指定したデータを、キーボードから入力可能な文字や記号に
一定の規則をもって変換する。(char値に変換する)
0628nobodyさん
04/05/08 19:34ID:???indexで書いてみるテスト。
my $cnt = 0;
my $pos = 0;
$cnt++ while(($pos = index($data, $match_str, $pos)+1) > 0);
>>595
Perlより先にアセンブラやってみるというのはどう?
# これ以上はスレ違いなので、後は本でも読んでみては。
0629595
04/05/08 20:31ID:???>>628
アドバイスありがとうございます。とりあえず、ゆっくり地道にやっていこうと思います。
バイナリ構造体についての質問は完全にスレ違いでしたね。
ところでこうゆう質問もスレ違いでしょうか?↓
相変わらず基礎的な部分で、コーディング(符号化)の流れについてなんですが、
例えばUNIX系のサーバにあるwebページに対して、「あいうえお」と送ったとします。
そのときの内部で起こっている事は、
1、送られてきた文字データをEUCでコーディング(エンコード)
2、それをさらにASC�Uコードでエンコード
文字列データとして表示させるには
1、まずはASC�Uコード化されたデータを受け取りASC�U方式でデコード
2、それをさらにEUCでデコード
で、合っていますか?なんか違う気もするんですが・・・
一番初めに文字列データをどの形式でコーディングするかの決定権をもっているのは
クライアント側のユーザですよね?受け取り側で自動でされる処理はASC�Uでエンコードするのみですか?
でもそれだと、何故UNIX系でEUCを指定されているのか?ですし・・
・・もしかしてこれもスレ違いな内容でしたら、一言「スレ違い」とお返事ください。
0630nobodyさん
04/05/08 20:33ID:???$_[0] =~ s/([^=^\"]|^)(https?\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1<a href=\"$2\" target=\"_blank\">$2<\/a>/g;
}
この場合
URLがある文字数を超えたときにそれ以降を省略するようにするにはどうしたらいいのでしょうか
substrとか使えばいいんだと思うんですけどよく解りません。
0632nobodyさん
04/05/08 21:52ID:???my $limit = 16;
s/([^=^\"]|^)(https?\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/
"$1<a href=\"$2\" target=\"_blank\">".substr($2, 0, $limit).
(length($2) > $limit && '..')."<\/a>"/egx;
こんなとか。
0634nobodyさん
04/05/08 22:37ID:???0635630
04/05/08 23:06ID:???0636nobodyさん
04/05/09 06:07ID:6P0icBMnファイルオープン後、
@temp = <FH>;
とすると行ごとに配列へ格納されますが、
\nも含めてひとつのスカラ変数に格納したいのです。
普通はjoin関数であとから結合するのでしょうか?
どうも冗長な気がし質問しました。
0638636
04/05/09 11:39ID:6P0icBMnありがとうございます!
$1〜、$_以外の特殊変数はまだまだ理解出来ないと思ってたら、こうやって使うんですね。
0639nobodyさん
04/05/09 12:54ID:LzQ8Bs2h@list = (0,1,2,3,4,5,6,7,8,9,10,11);
sub number {
if ($a < $b) {
return -1;
} elsif ($a == $b) {
return 0;
} elsif ($a > $b) {
return 1;
}
}
@result = sort number @list;
@resultが何故0,1,2,3,4,5,6,7,8,9,10,11になるのか理解できません。
漏れの考えですが、$aに0、$bに1が代入される。比較され-1が返る。@resultの第一要素は「-1」になる。
以降繰り返しで@resultは-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1となるのでは?と考えました。
@resultが何故0,1,2,3,4,5,6,7,8,9,10,11になるのか教えてください。
0640nobodyさん
04/05/09 13:44ID:???$a == $b なら ($a, $b) のまま
$a > $b なら ($b, $a)
の配列要素の順番入れ替えをおこなうのが sort 関数
数値の昇順や降順にソートすることは簡単にできる。
@result= sort {$a <=> $b} @list;
@result= sort {$b <=> $a} @list;
0642nobodyさん
04/05/09 15:48ID:???0643nobodyさん
04/05/09 16:26ID:Si4CJEJNopen(IN,"/なんとか/test.cgi|");
@file = <IN>;
close(IN);
print @file;
だと出来るのに
open(IN,"/なんとか/test.cgi?hoge|");
@file = <IN>;
close(IN);
print @file;
だと「sh: /なんとか/test.cgi?hoge: No such file or directory」と表示され開けません。
どなたかご教授ください。
0644nobodyさん
04/05/09 16:39ID:???0645nobodyさん
04/05/09 16:44ID:???0646nobodyさん
04/05/09 16:48ID:???0647nobodyさん
04/05/09 16:51ID:???失敗する、間違いない。
2ちゃんの掲示板だからこそ、人が集まりこういう流れが成立してる。
他スレでもそういう案は見かけるが、大抵が誘導に失敗し元に戻る。
Q&Aのデータベースなら活用されるとは思うが。
0649nobodyさん
04/05/09 16:57ID:???0650nobodyさん
04/05/09 17:49ID:???ム板のPerlスレにもそんなことをやろうとしたヤシがいたが、結局公開に至らず。
日本人って熱は冷めやすいから、飽きたんだろうね。
そういうことなので、>>648にはごく基本的なシステムでとりあえず公開することをきぼん。
その上で突込みが入れば修正すればいいんだし、自分で修正できなかったらここで質問すればいいんだし…
0652nobodyさん
04/05/09 18:06ID:???ちょっとしたシステムの不満でもみんな吐きまくるぞ。
そして最後には自分で作った方が早いとなっていく。
他人のシステムで満足できるような人間はこのスレにあまり来ないだろうし。
やるんだったらいっそ逆にPerl使わないほうが安全かも。
もしくはこのスレ住人の力を結集して作っていくか。
0653名無しさん
04/05/09 18:14ID:???俺はめんどくさいしやる気も無いのだが、まずは
過去ログを全検索して一覧表示できるようにっつうのは?
あとは>>をみてリンクツリー構成表示するとかね。
手動なんて絶対力つきるしPerlスレなんだからPerlつこて自動化すれ。
0654nobodyさん
04/05/09 18:17ID:???■ このスレッドは過去ログ倉庫に格納されています