• ベストアンサー

chomp( shift(@array) )

前々から疑問だったのですが、Perl 5.8 で @array = ("test\n", "hogehoge"); chomp( shift(@array) ); は Can't modify shift in chomp at XXXX.pl line X, near "))" というエラーの下実行できないのですが、なぜこの書き方が出来ないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

chomp が引数にとるのは、変数(や変数のリスト)です。 chomp ("test\n"); などはできません。 配列の中の要素から末尾の改行を取り除くには 単に @array = ("test\n", "hogehoge"); chomp( @array ); とすれば良いです。 末尾に改行が無い場合何も変化しません。

arcsin
質問者

お礼

chomp(@array) と書くことができるのですね。 いつも, $a = shift(@array); chomp($a); と書いていたので、直感的に chomp(shift(@array)); となぜ書けないんだろうと長く悩んでいました。 そして、間抜けな質問だったことに気が付きました^^; ご回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

shift()が左辺値(lvalue)でないからだと。

参考URL:
http://en.wikipedia.org/wiki/Lvalue
arcsin
質問者

お礼

あ、そう言われてみればそうですね! $a = chomp( shift(@array) ); みたいな使い方をしたかったのですが、chompは引数で与えた文字列そのものが影響を受けるのですね。 (しかも戻り値は \n があった場合に1、そうでない場合は0) かなり間抜けな質問でしたが、長年の疑問が晴れました。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PERLのSHIFT_JISの振る舞いについて

    PERLでプログラムを作る時、SHIFT-JIS形式で長音符(ー)があると、エスケイプしてもエラーが出てしまい困っています。 また、ホームページそのものがSHIFT_JIS形式のため、UTF-8など他の形式を使うと煩雑になるため避けたいと思っています。 エスケイプさせるなど簡単な方法は無いものでしょうか? また、こちらはご存じでしたら教えていただきたいのですが、「¥」マークでエスケイプしてもうまくいかない文字には他にどの様なものがありますでしょうか? ---test.pl---SHIFT_JIS形式---- $| = 1; $test = "\テ\ス\タ\ー"; $test =~ s/\テ\ス\タ\ー/tester/; print $test; エラーを見ると、 Unmatched [ in regex; marked by <-- HERE in m/\テ\ス\タ\ー <-- HERE / at test.pl line 3. とでます。

  • ActivePerl-5.10.0.1004の日本語対応にする方法

    超初心者の質問ですみません。 今、Perlの絵本でActivePerlの勉強中ですが use encording"shiftjis"; $a=1; print "はじめは$aでした。\n"; $a=++; print "1増えて$aになりました。\n"; $a=--; print "1減って$aに戻りました。\n"; を実行しても、 Can't locate encording.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib . ) at hello8.pl line 1. BEGIN failed--compilation aborted at hello8.pl line 1. と表示されます。 解消法を教えてください。

  • perl2exeでuse encodingが使えない

    下記のようなスクリプトを作成しました。 スクリプト名は test_kanji.pl ---------------- use encoding("shift-jis"); print "表現\n"; ----------------- 上記を実行すると、正しく”表現”の文字が表示されます。 これをperl2exeで実行形式に変換すると 下記のエラーが表示され、期待した結果が得られません。 Converting 'test_kanji.pl' to test_kanji.exe Warning: Can't locate I18N/Langinfo.pm at C:\Perl\lib\encoding.pm line 41 @INC = c:\perl\userlib, C:\Perl\lib, C:\Perl\site\lib, . 又、強引にtest_kanji.exeを実行すると encoding: Unknown encoding 'shift-jis' at C:\Perl\userlib\test_kanji.exe line 1 BEGIN failed--compilation aborted at C:\Perl\userlib\test_kanji.exe line 1. のようなメッセージが表示され、”表現”が表示されません。 perl2exeでuse encodingは使用できないのでしょうか。

  • cgi-libを使って変数値渡しをしたいのですが

    cgi間の変数渡しの質問をしたのですが、うまくいかなかったので、調べてみると、 cgi-lib.pl'を使うことで簡単に値を渡せるということが分かりました。 ですが、 use lib '/home/www'; require 'cgi-lib.pl';# cgi-lib.plを呼び出す $test=1000; # 変数値渡し? form_input_post.cgi?name=$test; &ReadParse(*in); として、$testの値をform_input_post.cgiに渡そうとしたのですが。 コンパイルエラーが出てしまいました。 Can't modify constant item in scalar assignment at form_input_post.cgi line 49, near "$test;" syntax error at form_input_post.cgi line 49, near "$test;" form_input_post.cgi had compilation errors. というエラーです。 初歩的なミスな気がしますが原因がわからないので教えて頂きたいです。 よろしくお願いします。

    • 締切済み
    • CGI
  • perl 配列名変数指定するには

    perlプログラムで for文で ループ分の配列定義するには どうしたらよいですか? 下記のようなことができないかと 考えております。 for(my $i = 0; $i < $file_no; $i++){ my @{"segments$i"} =(); #配列定義 my ${"line$i"}="";     #変数定義 my %{"hash$i"}= ();    #ハッシュ定義 open(ARG1,$ARGV[$i]); while(<ARG1>){ ${'line'.$i} = $_; chomp ${'line'.$i}; @{'segments'.$i} = split(/\t/,${'line'.$i});        ${'hash'.$i}{${'segments'.$i}[0]}=${'segments'.$i}[1];     } close(ARG1); } #下記で、その後 各ハッシュに設定したデータをもとに いろいろ計算したい foreach my $a (keys %{'hash'.$i}){ ・・・ } 今は、Can't declare array dereference in "my" at test.pl line XX, near "} =" と 配列定義でエラーとなり処理できません。

    • ベストアンサー
    • Perl
  • Perlからメール送信で文字化け

    Perl5.8からsendmailを使ってメール送信しています。 髙や﨑が入ると文字化けします。文字化けしないようにする方法を教えてください。 #!/usr/bin/perl require 'jcode.pl'; require 'mimew.pl'; $sendmail = '/usr/lib/sendmail'; print"Content-type: text/html\n\n test\n"; if (!(open(OUT,"| $sendmail -t -i -f xxxx\@hogehoge.co.jp"))) { ; } print OUT "To: xxxx\@hogehoge.co.jp\n"; print OUT "From: xxxx\@hogehoge.co.jp\n"; print OUT "Reply-To: xxxx\@hogehoge.co.jp\n"; $subject = "サブジェクト 髙﨑"; $subject = &mimeencode($mail_subject); print OUT "Subject: $mail_subject\n"; print OUT "Mime-version: 1.0\n"; print OUT "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n"; print OUT "Content-Transfer-Encoding: 7bit\n\n"; $honbun = "メール本文 髙﨑"; &jcode'convert(*honbun, 'jis'); print OUT "$honbun\n"; close(OUT);

    • ベストアンサー
    • Perl
  • HASH ARRAYの表示方法

    「print "@$token"」 とすると 「xxxx HASH(0x10063c0) ARRAY(0x10063a0) xxxx」 のように表示されます。 「HASH ARRAY」 の内容を表示したいのですが、どのようにすればよいのでしょうか? いろいろ試行錯誤したのですがどうしてわかりません。 具体的には「HTML::TokeParser」によって得た返値です。 $p = HTML::TokeParser->new(shift||"test.htm"); while (my $token = $p->get_tag("table")) { print "@$token\n"; } (参考) http://homepage3.nifty.com/hippo2000/perltips/html/TokeParser.htm

    • ベストアンサー
    • Perl
  • デバッガでブレークポイントを削除できない

    今読んでる本、CGIプログラミング第2版ですが、いよいよ終盤です。 第15章 CGIアプリケーションのデバッグまで読み進めてきました。 Perlデバッガのコマンド表にあるコマンドを試しています。 b[ 行番号| サブルーチン名]コマンドでカレント行、指定行、指定サブルーチンへブレークポイントを設定できました。 今度は d[ 行番号| サブルーチン名]コマンドでブレークポイントを削除しようとしたのですが、削除できていませんでした。 何度試しても先ほど設定したブレークポイントで停止してしまいます。 さらに引数として行番号やサブルーチン名を与えたときは次のエラーが発生します。 Number found where operator expected at (eval 5)[/usr/lib/perl5/5.8.0/perl5db.pl:17] line 2, near "d 5" eval '($@, $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop; d 5; ;' called at /usr/lib/perl5/5.8.0/perl5db.pl line 17 DB::eval called at /usr/lib/perl5/5.8.0/perl5db.pl line 1323 DB::DB called at try line 4 (Do you need to predeclare d?) eval '($@, $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop; d 5; ;' called at /usr/lib/perl5/5.8.0/perl5db.pl line 17 DB::eval called at /usr/lib/perl5/5.8.0/perl5db.pl line 1323 DB::DB called at try line 4 syntax error at (eval 5)[/usr/lib/perl5/5.8.0/perl5db.pl:17] line 2, near "d 5" またDコマンドは全ブレークポイントを削除するそうですが、これも効きませんでした。 本件について、何か情報をお持ちの方、教えてくださいm(__)m

    • ベストアンサー
    • Perl
  • Text::CSV_XSの設定について

    環境 OS Windows XP SP2 Perl v5.8.8 cpanからText::CSV_XSモジュールをダウンロードして そのモジュールをC:/perl/perl/lib/Textに配置しました。 ファイル名 a.pl use Text::CSV_XS; というコードを実行したら Can't locate loadable object for module Text::CSV_XS in @INC (@INC contains: C:/ perl/perl/site/lib C:/perl/perl/lib .) at a.pl line 4 Compilation failed in require at a.pl line 4. BEGIN failed--compilation aborted at a.pl line 4. というエラーが出ました。 他にもファイルがあったのでそれが関係あるのでしょうか?

    • ベストアンサー
    • Perl
  • perl 初めてのプログラムにエラーが出ます

    hello.pl というファイルに print “hello”; と、書きました。 ターミナルに perl -cw hello.pl と、入力しました。 Unrecognized character \xE2; marked by <-- HERE after print <-- HERE near column 7 at hello.pl line 1. と、メッセージが出ました。 解決方法を教えて頂きたいです。 よろしくお願いします。

    • ベストアンサー
    • Perl