トップページ⇒php
1001コメント375KB

Perlコーディング初心者質問スレ Part 39

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/11/27 11:35:03ID:DJwiGeFM
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0545nobodyさん05/01/03 07:29:08ID:???
>>544
cpan使ったことないけど、
cpan -c
かと。
0546nobodyさん05/01/03 14:59:35ID:???
@bar= @foo[0 .. $n-2,$n..$#foo];
0547nobodyさん05/01/03 15:21:38ID:???
>>543
元質問をちゃんと読んでる?
0548nobodyさん05/01/03 15:33:20ID:???
>>539
言語コード???
0549nobodyさん05/01/03 15:50:56ID:???
>>547
というか元質問自体が曖昧なので、同じ値を削りたいのか
n番目の値を削りたいのかどちらともとれるし。
055054005/01/03 16:01:28ID:???
>>547
読んでるよ。
offsetとlengthは、537に合うように変えてくれれば良い。
その意図で543の様に書いたんだし。

ま、549の言う通りだな。
540の指摘が癇に障ったなら謝るわ。
0551nobodyさん05/01/03 16:02:09ID:???
>>549
>1:2 3 4 5 6
>2:1 3 4 5 6
>3:1 2 4 5 6
>4:1 2 3 5 6

これは表示結果なのか、あるいは1を任意の要素(の値)とすると
残りの要素(の値)である2 3 4 5 6を取り出したいのかわからんね。

まあ、>>537が再度書くまで放置するしかあるまい。
0552nobodyさん05/01/03 16:02:10ID:???
>>537
中身を見て、取り出すなら。('3'を取り出してみるとすると)
my @foo = qw(1 2 3 4 5 4 3 2);
my @found = grep{ not index($foo[$_], '3') }(0..$#foo);
defined $found[0] and splice(@foo, $found[0], 1);

# grepがちょっぴり優雅だから、普段はforeach回すかなぁ。
0553nobodyさん05/01/03 16:21:47ID:???
それって@foo[2]の3だけ除くんでしょ?
だったらそこまで複雑にしなくても>>543のように

splice(@foo, 2, 1); でいいのでは?
0554nobodyさん05/01/03 16:24:24ID:???
言い方がおかしいか。
「@foo[2]の3だけ除かれる」
0555nobodyさん05/01/03 17:05:07ID:???
>>553-554
>>552は中身が'3'の最初のものを削除するんだけど、
'3'が常に$foo[2]にあるとは限らないとしたら?
または、配列に'3'が含まれていなかったら?

質問では、配列の内容は
> 例えば
だから実際は、
use List::Util qw(shuffle);
my @foo = shuffle (1..10);
なんて物かもしれないしね。
0556nobodyさん05/01/03 17:15:15ID:???
>>555
>'3'が常に$foo[2]にあるとは限らないとしたら?
>または、配列に'3'が含まれていなかったら?
全然影響しないでしょ。

>splice(@foo, 2, 1);
foo[2]を1個取り除くだけなんだから。

元質問が複数の要素を一度に取り除いたものを得たい、または
要素の中から任意の「値」を取り除いたものを得たいのなら別だけど。
0557nobodyさん05/01/03 17:35:35ID:???
>>556
> 中身を見て、取り出すなら。('3'を取り出してみるとすると)
> 中身が'3'の最初のものを削除するんだけど、
これは無視?

> 要素の中から任意の「値」を取り除いたものを得たいのなら別だけど。
別も何も、これをコード化したものですが。

>>549さんの
> というか元質問自体が曖昧なので、同じ値を削りたいのか
> n番目の値を削りたいのかどちらともとれるし。
という意見の"同じ値を〜"の方のコードを書いたまでです。
055853705/01/03 19:03:14ID:BvOHark/
質問が曖昧すぎて混乱させてしまいました。申し訳無いです。
深夜に作業するもんじゃないですね。

n番目の値以外の要素を取り出したい、と言うのが真意でした。

#n番目の値以外を全て足し合わせると言うルーチンを作りたかった
#
#@foo = qw(1 2 3 4); という配列があったら
#$bar[0] = 2+3+4
#$bar[1] = 1+3+4
#$bar[2] = 1+2+4
#$bar[3] = 1+2+3

要素は重複する可能性があります。
#grepでそのままやるのは無理そう?
0559nobodyさん05/01/03 19:39:41ID:BmWNnWLw
Perlの関数の括弧があるのとないのって、どう違うんでしょうか?

例↓
open IN, "aaa.txt";
open(IN, "aaa.txt");

私の持っている本には、括弧が書いてある本と書いていない本が
あるのですが、括弧についての説明がなくてよく分かりません。
説明しているサイトも見つけられませんでした。
よろしくお願いします。
0560nobodyさん05/01/03 20:13:20ID:1lDTWYQS
括弧が無い場合、Perl が勝手に括弧を補って構文解析してくれる。

ほとんどの場合プログラマの意図したとおりに補ってくれるが、
ごく稀に、意図しないところに括弧を補って恐ろしい動作をしてくれることもある。
まあ演算子の優先順位を厳密に考えてれば防げることなんだが、
それよりは括弧を明示的に付ける方が楽ではある。
0561nobodyさん05/01/03 21:21:18ID:???
>>558
配列を壊していいならspliceで、壊したくなければ>>546の配列
スライスでいいんでない。要素の位置で指定する場合は配列を
そのままgrepでは無理です。どうしてもgrepつかいたけりゃ
0..$#fooでインデックスの配列作ってそっちにgrepする手はある
けど。

オーバーフローや浮動小数点の誤差を気にしなくていいのならば、
配列を加工しようとせずに全部の要素の和からn番目の要素の値を
引き算する方がいいかもね。

0562nobodyさん05/01/03 21:30:46ID:???
COOKIE、GET、POSTとかで、%00をブロックした方が良いって聞いたけど、
どこをブロックすればいいの?
正規表現で全部チェックすれば良いのかな。。。

あと、安全のためにブロックした方が良い文字ってある?
0563nobodyさん05/01/03 21:37:14ID:???
>>562
どの文字をブロックするか考えるより、何を通していいか考えて
それだけ通すようにした方がいいと思うよ。

あとは出力するときに過不足なくエスケープすること。

-Tフラグを使うとすこし安心かもね。汚染除去するときの正規
表現を適切なものにしないと意味ないけど。

056455905/01/03 22:38:42ID:???
>>560
それじゃ、Perlでは括弧は常につけておいた方がいいということなんですね。
他の言語はVBしか知らないのでVBですみませんが、
VBだと関数の戻り値がある場合は括弧が必須で、
ない場合はどちらでもいいようです。
Perlでも何か違いがあるのかと思っていました。
どうもありがとうございました。
0565nobodyさん05/01/04 01:14:24ID:WiFbXIfd

Perlは変幻自在な妖怪みたいな言語
0566nobodyさん05/01/04 02:41:43ID:???
                        ,. -?‐ `'' 、
   ┏┓  ┏━━┓        /.,;彡;, ..,;,.   ゙ミヽ、     ┏━━┓  ┏┓  ┏━┓
 ┏┛┗┓┃┏┓┃       /ソノ;彡;彡;彡;彡'゙ヽ;゙i;,ヽ   ┃┏┓┃┏┛┗┓┃  ┃
 ┗┓┏┛┃┗┛┃┏━━━{i;゙|il|l!ノ彡';彡;'','⌒ ゙!l!l}i゙!━┓┃┃┃┃┃┏┓┃┃  ┃
 ┏┛┗┓┃┏┓┃┃      {ノl!|!;ソ;ノリノ'″Perlノ;li|l!1  ┃┃┃┃┃┗┛┃┃┃  ┃
 ┗┓┏┛┗┛┃┃┗━━━'{i|{il{li゙!ソ;'  ` ' `"″!l}!i|!━┛┃┃┃┃    ┃┃┗━┛
   ┃┃      ┃┃         '{;l!|{i!リ''  _ノ    ;i|!レ'     ┃┗┛┃  ┏┛┃┏━┓
   ┗┛      ┗┛        '゙i!|!;'、,_´__,ノ '″    ┗━━┛  ┗━┛┗━┛
0567nobodyさん05/01/04 18:05:38ID:???
質問です。

例えば、$mesに文字列「あああああ<p>あああいいい</p>いいうええええ」
が入っていたときに<p>から</p>までの間の「あああいいい」を取り出すにはどうしたら良いでしょうか?

よろしくお願いします(;´Д`)人
056856705/01/04 18:09:51ID:???
あ、違った・・・すみません、脳みそまとめてから質問しますorz
0569nobodyさん05/01/04 18:16:31ID:ufv1QlyO
スレ汚しすみません。改めて質問です。

例えば、$mesに文字列「あああああ<p>あああいいい</p>いいうええええ」が入っていたときに
<p>から</p>までの間の「あああいいい」を編集して例えば「いいいううう」等にして
$mesが「あああああ<p>いいいあああ</p>いいうええええ」となるようにしたいのですが
どのようにしたら出来るでしょうか?
0570nobodyさん05/01/04 18:27:37ID:???
置換えなら正規表現でもいいが、編集してって何よ?
0571nobodyさん05/01/04 18:47:37ID:???
その置き換えを<p>から</p>までするにはどうしたらいいんでしょうか・・・
0572nobodyさん05/01/04 19:20:58ID:???
>>569
# <p>〜</p>までを抜き出す
$mes =~ m|^(.+)<p>(.+)</p>(.+)$|;
$before = $1;
$inside = $2;
$after = $3;

# 中身を書き換える
$inside = "いいいううう";

# つなげる
$mes = "$before<p>$inside</p>$after";

ってこと?
0573nobodyさん05/01/04 19:27:40ID:???
はいっ、そういうことです。
0574nobodyさん05/01/04 23:16:36ID:Y/b3Mf5i
質問なのですが、
Use strict;
を使って書いてるのですが、サブルーチンの中から複数の値を返したい時はどうすれば良いのでしょうか? 

例えばですが、
sub a{
my $a = 1;
my $b = 2;
my $c = 3;
}
というサブルーチンがあったとして、$a, $b, $c, それぞれの値を参照したいという感じなんですが・・・・。
既に出たような質問だったらすみませんが、よろしくお願いいたします。
0575nobodyさん05/01/04 23:21:43ID:???
>>574
配列で返す

($a1,$b1,$c1) = a();

sub a {
my $a = 1;
my $b = 2;
my $c = 3;
return ($a, $b, $c);
}

既に何度も出ているような気はまあ確かにする
057657405/01/04 23:38:07ID:???
>>575
早速レスして頂いてありがとうございます。
配列で返すとは思いつきませんでした。まだまだ知らないことだらけです(汗
教えて頂いたことを試してみます、どうもありがとうございました☆
057757405/01/05 00:13:08ID:???
試したらうまいこと出来ました、ありがとうございました☆

勢いでもう一つ質問してしまいますが、複数の配列を返したい場合はどうしたら良いでしょうか?(とりあえず同じように試したらダメでした)
調べてみた所、リファレンスを使って返すとあったのですが、それが最良の方法でしょうか? ↓こんな感じで・・・。

sub foo {
return \%hash, \@array;
}

いろいろ聞きまくってしまって申し訳ありませんが、よろしくお願いいたします。
0578nobodyさん05/01/05 00:15:45ID:???
ちょっとした質問です。
13 <= $teens && $teens <= 19
という評価式はなんだか冗長なのでもっと見やすくすることはできませんか?
$teens == 13 .. 19 くらい簡単に書けてもいいような気はするのですが。
0579nobodyさん05/01/05 01:25:20ID:???
>>577
一緒くたにしたあと長さで分離する手もあるにはあるが
普通はリファレンス使うのが良いと思う

>>578
perl 6 になるとなんかその手の書き方ができるようになると聞いたが
今のところは我慢しる
0580nobodyさん05/01/05 02:10:00ID:V9sS6I44
質問させてください。
現在9個の要素が入っている配列@arrayの0から4までの要素を
my ($a, $b, $c, $d)にいれて、コピーした要素を配列から消去
したいのですが、スマートな方法はありませんか。
my ($a, $b, $c, $d) = shift @array;感じとしてはこんな風に・・・

よろしくお願いします。
058158005/01/05 02:14:50ID:V9sS6I44
↑ごめんなさい、0から3です。
0582nobodyさん05/01/05 02:16:38ID:???
>>577
調べろ

sub a {
 my %hash = ( a => 1, b => 2 );
 my @array = ( "a", "b", "c" );
 my $ref = [ \%hash, \@array ];
 return $ref;
}
0583nobodyさん05/01/05 02:18:17ID:elOzKoqY
>>580
spliceを使えばよいかと。
こんな感じで。
splice(@array, 0, 4);




058458005/01/05 03:11:37ID:V9sS6I44
>>583
なるほど、こんな便利な関数があったのですね。
ありがとうございました。
0585nobodyさん05/01/05 03:37:03ID:???
if ($hoge - $foo == 0 || $hoge - $foo == 1) {
}
これって一つの条件式、あるはもっと簡単に出来ないでしょうか
0586nobodyさん05/01/05 03:50:02ID:???
>>585
>>578-579
0587nobodyさん05/01/05 04:02:01ID:???
あららそんな近くに答えがあったんですね
すいませんでした。。&& thx;
058857805/01/05 04:12:42ID:???
>>579
回答ありがとうございます。
今初めてPerl6に期待しちゃいました。
0589nobodyさん05/01/05 04:39:44ID:???
Perl6…開発開始してからもう何年経ったっけ?w
0590nobodyさん05/01/05 07:39:31ID:???
>>585
# 1以下
if ($hoge - $foo <= 1) {
    # 処理;
}

ただし、0.5とかも入っちゃうけど…。
0591nobodyさん05/01/05 07:48:27ID:???
>>585 >>590
if (($hoge - $foo) =~ /^[01]$/) {
0592nobodyさん05/01/05 08:01:47ID:???
>>590
マイナスもな
0593nobodyさん05/01/05 15:36:47ID:???
質問です。文章中において
>|     <strong>
文章 → 文章
|<     </strong>
みたいな事をしたいのですが、どうしたらよいでしょうか。


自分で考えたのは
$mes =~ s/(>\|)((\n*.*)*)(\|<)/<strong>$2<\/strong>/g;
この場合
>|あああ|< → <strong>あああ|<
>|いいい|<    >|いいい</strong>
となるので
$mes =~ s/(>\|)((\n*[^(<\|)]*)*)(\|<)/<strong>$2<\/strong>/g;
としたのですが、これだと >| |< の中にlやtがあっても駄目です。
0594nobodyさん05/01/05 18:04:47ID:???
>>593
正規表現の部分にちょっと無駄な部分があるような希ガス

$mes =~ s/>\|(.*?)\|</<strong>$1<\/strong>/gs;

(Perl5以上で)これでいいんじゃないかな。

解説
・ >| と |< を括弧でくくる理由がわからない。
・繰り返し記号の後に ? を使ったら、最短でマッチする。
・オプション s を使うと、 . (←半角ドットね^^;)も改行文字にマッチするようになる。
0595nobodyさん05/01/05 18:07:50ID:???
594です
ごめん、ちょっと電波が
$mes =~ s/>\|/<strong>/g;
$mes =~ s/\|</<\/strong>/g;
じゃだめなの?
0596nobodyさん05/01/05 18:39:11ID:???
それだと

>|
ちりぬるを
|<
いろはにほへと|<

とかなっていた時に困った事になるんです。
なので、「>|を発見したら、以降に|<があればそれぞれを置換し、これを最後まで繰り返す」ような事を
したい訳なのですが、いい案が思いつかないんですよね・・・。
0597nobodyさん05/01/05 18:43:18ID:???
>・ >| と |< を括弧でくくる理由がわからない。
「>|」とかっていうのは記号の例えでして、掲示板でタグを使えない代わりに
そういう記号でマークアップさせようという意図からです。・・・が正直厳しいです。

>・繰り返し記号の後に ? を使ったら、最短でマッチする。
>・オプション s を使うと、 . (←半角ドットね^^;)も改行文字にマッチするようになる。
勉強になりました!ありがとうございます。
0598nobodyさん05/01/05 19:11:13ID:???
じゃあ
$mes =~ s/>\|(.*?)\|</<strong>$1<\/strong>/gs;
ってやってしまおう。

括弧でくくる、ってのは
(>\|)
これね。グルーピング、説明不足ですまん
0599nobodyさん05/01/05 21:09:19ID:fN7gQymP
print "@$row[0]";  を実行した結果が、
あいうえおかきく

print "@$row[0]\n";  を実行した結果が、
あいう
えおか
きく

となる配列の要素を、
「あいう」、「えおか」、「きく」
それぞれ別の変数(もしくは配列)に入れる方法を教えてください。

print "$a, $b, $c";  を実行すると、
あいう, えおか, きく
(↑例えばこのように出力したい)

chomp、 split(/\n/, @$row[0]) では不可でした。
0600nobodyさん05/01/05 21:40:56ID:???
>>599
print "@a"; を print "@a\n";にかえただけで改行が
少なくとも2箇所増えるような@aはオレには思いつかない。
0601nobodyさん05/01/05 22:30:59ID:DtV5vUlC
use utf8; で作っているのですが、
DBに格納してあるutf8の文字列を取得するとき、その都度 utf8::decode($str)
としてUTF8フラグを付けているのですが、自動的にUTF8フラグが付くようにする
にはどのようにしたらよいのでしょうか?
060259305/01/05 23:36:16ID:???
>598
ありがとうございます。
$mes =~ s/>\|(.*?)\|</<strong>$1<\/strong>/gs;
にしたら動くには動いたのですが
>|         <strong>
>|ああああ|<→ >|ああああ</strong>
|<         |<
となってしまいました・・・結果を見れば多少納得しつつも改善策が思いつかないです・・・。
Wiki的記法スクリプト作ってる人って凄い・・・orz
0603nobodyさん05/01/05 23:40:02ID:???
ぁ、ためしに
$mes =~ s/>\|(.*?)\|</<strong>$1<\/strong>/gs;
を2行連続して書く事で602の現象は回避できました・・・が、
これだと激しく手順がおかしい・・・(;´Д`)
0604nobodyさん05/01/05 23:40:55ID:???
じゃあWikiのソース参考にすれば?
文章の整形や修飾に関しては全然難しい事やってないよ。
0605nobodyさん05/01/05 23:49:42ID:???
>>599
その質問の真意はよくわからんけど、
馬鹿正直に答えるとまずprint関数の定義をいじらんとダメかな。
perlはめちゃくちゃな言語なんでいじる手段は複数あるよ。
でも、きっと君が望む回答じゃないと思う。

まず本当に自分がやりたい事を整理しなされ
0606nobodyさん05/01/05 23:59:20ID:???
>604
そうなんですか。
実は読んだのですが、2日前にPerl始めたばっかりなんで結構チンプンカンプンでした・・・。
精進します。
0607nobodyさん05/01/06 03:24:55ID:???
つまり >|.*?|< という括弧のネストを解決したいわけだな
0608nobodyさん05/01/06 06:40:28ID:???
>>593
括弧の種類が一つならば、ネストは考えなくてもいい。

my ($open, $close);
$data =~ s/(>\|)|(\|<)/$1 ? ($open++, "<strong>") : ($close++, "<\/strong>")/ge;
($open > $close) and die "開き括弧が多すぎます";
($open < $close) and die "閉じ括弧が多すぎます";
060960805/01/06 12:23:08ID:???
訂正です。閉じが先に来るパターンを忘れてました。

my ($open, $close);
$data =~ s/(>\|)|(\|<)/
$1 ? ($open++, "<strong>") :
(($open <= $close and die "対応する開き括弧が見つかりません"),
$close++, "<\/strong>")/ge;

($open > $close) and die "対応する閉じ括弧が見つかりません";
0610ty8it05/01/06 12:31:38ID:???
ut
0611nobodyさん05/01/06 12:41:53ID:???
つーか>>595でいいじゃん、残り全部強調したいのかも知れないし
0612nobodyさん05/01/06 12:49:00ID:???
>>611
|<あああ>| →</strong>あああ<strong>
|>| →</strong>strong>

この辺りを許容するかどうかだけどね。
許容するなら、>>595のでもいいし。
061359905/01/06 13:53:22ID:???
>>600 >>605
回答ありがとうございました。解決しました。

print文がLoopされていて
@$row[0] がそのつど書き換わっていただけでした。
素人甚だしく申し訳ございませなんだ
0614nobodyさん05/01/06 17:38:48ID:???
>612
許容でいいんじゃないの?
>609みたいに親切にエラー表示しなくてもいいような気がする・・・

意図する表現にならなかったらユーザーが文法間違えたってことだから、
入力したユーザーが修正で再度入力すればいいだけじゃないの?
掲示板で使うってことだから、書き込む前に変換後のプレビュー画面でも見せて
そこで修正するかそのまま書き込むかユーザーに選ばせればいいと思う。
0615nobodyさん05/01/06 20:45:08ID:???
質問
 XMLをハッシュに変換したいのですけどどうしたらよいでしょうか
0616nobodyさん05/01/06 21:25:44ID:VJDwnbh+
サブルーチンの中で<STDIN>を使って入力した値を受け取り、その値を比較に使おうと
思っても上手く行きません・・。何が原因なのでしょうか?

sub a{
my $input = <STDIN>;
if($input eq "a"){print "a\n";}
}

こんな感じのソースで、入力時に「a」と入力してもその後の文字列比較が上手く
いかないようで、printが行われません。何でなのでしょうか?
初歩的な質問ですいません。
0617nobodyさん05/01/06 21:35:38ID:???
my $input = <STDIN>
chomp $input;
if($input eq ...
0618nobodyさん05/01/06 22:40:43ID:???
>>615
なんか久々に見る大胆な質問だな
DOMツリーを作るなら XML::DOM とかあるが、どういう形のハッシュで出力させたいんだ?
061961605/01/07 00:37:45ID:???
>>617
なんと改行文字が含まれていたからなのですな・・・・。
ドツボにはまってました(汗

どうもありがとうございました!
0620nobodyさん05/01/07 05:02:49ID:???
>>615
XML::Simple が丁度 XML <=> Hash 変換してくれるモジュール。
0621nobodyさん05/01/07 09:45:47ID:???
>>619
このケースに限らないが、困った時はまず変数の中身を確認しろ。

use Data::Dumper;
print Dumper($scalar);
print Dumper(\%hash);
print Dumper(\@array);
0622nobodyさん05/01/07 11:48:48ID:???
多次元配列をサブルーチンの中で生成して、リファレンスを返したのですが、その多次元配列を
別のサブルーチンで扱うにはどうしたら良いのでしょうか?
リファレンスを渡すだけだと、
Can't use string ("ARRAY(xxxxxxxx)") as an ARRAY ref while 〜
と怒られてしまうのですが・・・・。
よろしくお願いいたします。
0623nobodyさん05/01/07 11:55:12ID:???
>>622
リファレンスを返すだけで普通は扱える。つか俺は使えている。
たぶん君の書いたコードが間違っているのだろう。
動かないコードと、何を読んでその書き方を憶えたか、を晒すと、
後学のためになると思う。
062462205/01/07 12:20:19ID:tb1n+4Nw
>>623
そうなのですか、まだ苦戦してます。やろうとしてるのは次みたいな感じです。

sub a {
open FH, '<', "$_[0]";
my @data;
while(<FH>){
push(@data, [ split(/;/) ]);
}
close(FH);
return \@data;
}

で生成した多次元配列@dataを別サブルーチンで扱いたいです。
my $ref = &a();
でリファレンスを受け取って、別のサブルーチンに引数として渡したのですが、
上手くいきません。

例えば、
sub b{
my $abc = $_;
foreach my $dummy (@{$$data[2]}){
print "$dummy";
}
}
とすると前述のエラーが出て怒られてしまいます。
何故なのでしょうか?
最初の質問が説明不足でしたが、よろしくお願いいたします。
062561505/01/07 12:28:40ID:???
>>620
やってみましたがリファレンスで返されて使いづらいのですが
0626nobodyさん05/01/07 13:53:30ID:???
>>624
sub b{
× my $abc = $_;
○ my $abc = $_[0];
○ my $abc = shift;
0627nobodyさん05/01/07 14:00:27ID:???
>>624
あと気付いてるとは思うが、
$abcに代入してるのに、$dataでデリファレンスしても
どうにもなんねーべや
062862405/01/07 14:30:35ID:tb1n+4Nw
>>626, >>627
レスありがとうございます。

$abc = $_[0];
で受け取って、$abc でデリファレンスしてみましたが、同じ様に
Can't use string ("ARRAY(xxxxxxxx)") as an ARRAY 〜 と出てしまいました。
$abc を表示したところ、ARRAY(0x810e7f0) と表示されたので、引数の受渡し自体
は上手くいっていると思いますが、そこからのデリファレンスがどうしても出来ません。
@{$abc}
@{$$abc}
とか、いずれも前述のエラーの対象となるようです・・・。
ここらへんざんまり良く分からないのですが、教えて頂けないでしょうか?
たびたびすみません
0629nobodyさん05/01/07 14:39:54ID:???
>>628
エラーが出る直前のあたりに print $abc; を入れて様子を見てみそ
063062405/01/07 14:51:20ID:tb1n+4Nw
並べて書いてみました。
sub b{
$abc = $_[0];
print "$abc\n"; #ARRAY(0x810e8c4) を出力
print "@$abc\n"; #Can't use string〜
print "@{$$abc[1]}\n"; #Can't use string〜
}

でした・・・・。

何故なのでしょうか?
サブルーチンの外で print "@$abc\n"; を実行すると
ARRAY(0x8118f74) ARRAY(0x8118fb0) ARRAY(0x8118ff8) ・・・・・
と表示されます。
構文がおかしいのでしょうか?
0631nobodyさん05/01/07 15:08:26ID:???
×b("$ref")
○b($ref)
0632nobodyさん05/01/07 15:14:52ID:???
>>630
あ、わかった気がする。
use strict してないでしょ。
063362405/01/07 15:19:31ID:???
>>630
問題解決しました!
引数として指定するときに""で囲ってました、リファレンスを渡す場合はいらないのですね。
気づいてみると単純なものでしたけど、ハマってました。

どうもありがとうございました!

>>632
use strict;
してました。もし同じことをするのにuse strict;を外すと、これまたエラーになってしまうのでしょうか?
0634nobodyさん05/01/07 19:09:58ID:???
変数を""で囲むという文化はどこから来たんだ
0635nobodyさん05/01/07 19:29:23ID:???
http://www36.tok2.com/home2/boboburajiru/xxx/data/bobo_20050107192625.lzh
これなんですけど、名前の部分とフォームの部分を一緒のformにいれることはできませんか?

1 スーパーひとし : テスト3 01/07’18:54
例えばこういう感じに。。
あと日付の表示のところに「'」が入ってしまいます。どうすればいいでしょうか。
0636nobodyさん05/01/07 19:30:21ID:???
訂正 フォームの部分→記事の部分
0637nobodyさん05/01/07 20:07:47ID:???
>>635
スレ違い
0638nobodyさん05/01/07 20:44:00ID:???
>>633
そのケースだとuse strictをしていないと*エラーにならず間違った動作*をする。
0639nobodyさん05/01/07 22:09:18ID:???
Perl初心者です。1つ質問させて下さい。

例えば

「今日は(・∀・)な日だった」

という文があったとして、この文から日本語だけを削除して

「(・∀・)」

このような文にしたいのですが、どのようにプログラミングすればいいでしょうか?
0640nobodyさん05/01/07 22:54:19ID:???
$data = '今日は(・∀・)な日だった';
$data =~ s/.*(\Q(・∀・)\E).*/$1/s;
0641nobodyさん05/01/07 22:57:48ID:???
$hoge='今日は(・∀・)な一日だった';
$hoge=~s/今日は//og;
$hoge=~s/な一日だった//og;
は間違いです
0642nobodyさん05/01/07 23:27:50ID:GrSDiTmV
gethostbyaddr関数の第2引数ってどういう意味なんでしょうか?
本によって、PF_INETと書いてあったりAF_INETと書いてあったりします。
よろしくお願いいたします。
0643nobodyさん05/01/07 23:30:16ID:???
>>1が読めないのかな?
0644nobodyさんNGNG
>>639
記号を残すということかな?
Shift-JISでひらがなを削除するにはこんな感じ。
$data = '今日は(・∀・)な日だった';
$data =~ s/\x82[\x9F-\xF1]//g;
あとは>>5のPerlメモから「日本語を扱う」とか、正規表現について調べたらいい。
■ このスレッドは過去ログ倉庫に格納されています